blob: 0ad5ac995679b53145f5d3ea016f3b0c819ac840 [file] [log] [blame]
Sundong Ahnd5e08f62018-12-12 20:27:28 +09001# Copyright (C) 2019 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the License);
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an AS IS BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15module: "android.sysprop.SurfaceFlingerProperties"
16owner: Platform
17
Steven Thomas2bbaabe2019-08-28 16:08:35 -070018# The following two properties define (respectively):
Sundong Ahnd5e08f62018-12-12 20:27:28 +090019#
20# - The phase offset between hardware vsync and when apps are woken up by the
21# Choreographer callback
22# - The phase offset between hardware vsync and when SurfaceFlinger wakes up
23# to consume input
24# Their values may be tuned to trade off between display pipeline latency (both
25# overall latency and the lengths of the app --> SF and SF --> display phases)
26# and frame delivery jitter (which typically manifests as "jank" or "jerkiness"
27# while interacting with the device). The default values must produce a
28# relatively low amount of jitter at the expense of roughly two frames of
29# app --> display latency, and unless significant testing is performed to avoid
30# increased display jitter (both manual investigation using systrace [1] and
31# automated testing using dumpsys gfxinfo [2] are recommended), they should not
32# be modified.
33#
34# [1] https://developer.android.com/studio/profile/systrace.html
35# [2] https://developer.android.com/training/testing/performance.html
36prop {
37 api_name: "vsync_event_phase_offset_ns"
38 type: Long
Inseob Kim44f34c52019-06-08 20:47:59 +090039 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +090040 access: Readonly
41 prop_name: "ro.surface_flinger.vsync_event_phase_offset_ns"
42}
43
44prop {
45 api_name: "vsync_sf_event_phase_offset_ns"
46 type: Long
Inseob Kim44f34c52019-06-08 20:47:59 +090047 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +090048 access: Readonly
49 prop_name: "ro.surface_flinger.vsync_sf_event_phase_offset_ns"
50}
51
52# Instruct the Render Engine to use EGL_IMG_context_priority hint if available.
53prop {
54 api_name: "use_context_priority"
55 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +090056 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +090057 access: Readonly
58 prop_name: "ro.surface_flinger.use_context_priority"
59}
60
61# Controls the number of buffers SurfaceFlinger will allocate for use in FramebufferSurface.
62prop {
63 api_name: "max_frame_buffer_acquired_buffers"
64 type: Long
Inseob Kim44f34c52019-06-08 20:47:59 +090065 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +090066 access: Readonly
67 prop_name: "ro.surface_flinger.max_frame_buffer_acquired_buffers"
68}
69
Brian Lindahla13f2d52020-03-05 11:54:17 +010070# Controls the maximum width in pixels that the graphics pipeline can support for GPU fallback
71# composition. For example, 8k displays with 4k GPUs, or 4k displays with 2k GPUs.
72prop {
73 api_name: "max_graphics_width"
74 type: Integer
Luca Stefani33522c42020-09-09 08:59:41 +020075 scope: Public
Brian Lindahla13f2d52020-03-05 11:54:17 +010076 access: Readonly
77 prop_name: "ro.surface_flinger.max_graphics_width"
78}
79
80# Controls the maximum height in pixels that the graphics pipeline can support for GPU fallback
81# composition. For example, 8k displays with 4k GPUs, or 4k displays with 2k GPUs.
82prop {
83 api_name: "max_graphics_height"
84 type: Integer
Luca Stefani33522c42020-09-09 08:59:41 +020085 scope: Public
Brian Lindahla13f2d52020-03-05 11:54:17 +010086 access: Readonly
87 prop_name: "ro.surface_flinger.max_graphics_height"
88}
89
Sundong Ahnd5e08f62018-12-12 20:27:28 +090090# hasWideColorDisplay indicates that the device has
91# or can support a wide-color display, e.g. color space
92# greater than sRGB. Typical display may have same
93# color primaries as DCI-P3.
94# Indicate support for this feature by setting
95# TARGET_HAS_WIDE_COLOR_DISPLAY to true in BoardConfig.mk
96# This also means that the device is color managed.
97# A color managed device will use the appropriate
98# display mode depending on the content on the screen.
99# Default is sRGB.
100prop {
101 api_name: "has_wide_color_display"
102 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900103 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900104 access: Readonly
105 prop_name: "ro.surface_flinger.has_wide_color_display"
106}
107
108# Indicates if Sync framework is available. Sync framework provides fence
109# mechanism which significantly reduces buffer processing latency.
110prop {
111 api_name: "running_without_sync_framework"
112 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900113 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900114 access: Readonly
115 prop_name: "ro.surface_flinger.running_without_sync_framework"
116}
117
118# hwHDRDisplay indicates that the device has an High Dynamic Range display.
119# A display is considered High Dynamic Range if it
120#
121# 1. is a wide color gamut display, typically DCI-P3 or lager
122# 2. has high luminance capability, typically 540 nits or higher at 10% OPR
123#
124# Indicate support for this feature by setting
125# ro.surface_flinger.has_HDR_display to true in device.mk
126# ro.surface_flinger.has_wide_color_display must be set to true when
127# ro.surface_flinger.has_HDR_display is true.
128prop {
129 api_name: "has_HDR_display"
130 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900131 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900132 access: Readonly
133 prop_name: "ro.surface_flinger.has_HDR_display"
134}
135
136# Specify the offset in nanoseconds to add to vsync time when timestamping present fences.
137prop {
138 api_name: "present_time_offset_from_vsync_ns"
139 type: Long
Inseob Kim44f34c52019-06-08 20:47:59 +0900140 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900141 access: Readonly
142 prop_name: "ro.surface_flinger.present_time_offset_from_vsync_ns"
143}
144
145# Some hardware can do RGB->YUV conversion more efficiently in hardware
146# controlled by HWC than in hardware controlled by the video encoder.
147# This instruct VirtualDisplaySurface to use HWC for such conversion on
148# GL composition.
149prop {
150 api_name: "force_hwc_copy_for_virtual_displays"
151 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900152 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900153 access: Readonly
154 prop_name: "ro.surface_flinger.force_hwc_copy_for_virtual_displays"
155}
156
157# Maximum dimension supported by HWC for virtual display.
158# Must be equals to min(max_width, max_height).
159prop {
160 api_name: "max_virtual_display_dimension"
161 type: Long
Inseob Kim44f34c52019-06-08 20:47:59 +0900162 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900163 access: Readonly
164 prop_name: "ro.surface_flinger.max_virtual_display_dimension"
165}
166
167# Return true if surface flinger should use vr flinger for compatible vr
168# apps, false otherwise. Devices that will never be running vr apps should
169# return false to avoid extra resource usage. Daydream ready devices must
170# return true for full vr support.
171prop {
172 api_name: "use_vr_flinger"
173 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900174 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900175 access: Readonly
176 prop_name: "ro.surface_flinger.use_vr_flinger"
177}
178
179# Returns true if surface flinger should start
180# hardware.graphics.allocator@2.0::IAllocator service.
181prop {
182 api_name: "start_graphics_allocator_service"
183 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900184 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900185 access: Readonly
186 prop_name: "ro.surface_flinger.start_graphics_allocator_service"
187}
188
189# Returns the orientation of the primary display device.
190prop {
191 api_name: "primary_display_orientation"
192 type: Enum
193 enum_values: "ORIENTATION_0|ORIENTATION_90|ORIENTATION_180|ORIENTATION_270"
Inseob Kim44f34c52019-06-08 20:47:59 +0900194 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900195 access: Readonly
196 prop_name: "ro.surface_flinger.primary_display_orientation"
197}
198
199# useColorManagement indicates whether SurfaceFlinger should manage color
200# by switching to appropriate color mode automatically depending on the
201# Dataspace of the surfaces on screen.
Alec Mouri88790f32023-07-21 01:25:14 +0000202# DEPRECATED: SurfaceFlinger is always color managed.
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900203prop {
204 api_name: "use_color_management"
205 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900206 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900207 access: Readonly
208 prop_name: "ro.surface_flinger.use_color_management"
209}
210
Alec Mouri88790f32023-07-21 01:25:14 +0000211# The following four properties define:
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900212# Returns the default data space and pixel format that SurfaceFlinger
213# expects to receive and output as well as the wide color gamut data space
214# and pixel format for wide color gamut surfaces.
215# To determine the data space and pixel format, there are a few things
216# we recommend to consider:
217#
218# 1. Hardware composer's capability to composite contents with the chosen
219# data space and pixel format efficiently;
220# 2. Hardware composer's ability to composite contents when sRGB contents
221# and the chosen wide color gamut data space contents coexist;
222# 3. For better blending, consider using pixel format where the alpha
223# channel has as many bits as the RGB color channel.
224# 4. Memory consumption and efficient buffer compression when considering
225# more bits in pixel format.
226
227# dataspace is the default data space that SurfaceFlinger expects.
228# The data space must not be Dataspace::UNKNOWN, if unspecified,
229# the default data space is Dataspace::V0_SRGB;
230prop {
231 api_name: "default_composition_dataspace"
232 type: Long
Inseob Kim44f34c52019-06-08 20:47:59 +0900233 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900234 access: Readonly
235 prop_name: "ro.surface_flinger.default_composition_dataspace"
236}
237
238# pixelFormat is the default pixel format that SurfaceFlinger
239# expects. If unspecified, the default pixel format is
240# PixelFormat::RGBA_8888.
241prop {
242 api_name: "default_composition_pixel_format"
243 type: Integer
Inseob Kim44f34c52019-06-08 20:47:59 +0900244 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900245 access: Readonly
246 prop_name: "ro.surface_flinger.default_composition_pixel_format"
247}
248
249# wcgDataspace is the data space that SurfaceFlinger expects for
250# wide color gamut surfaces.
251# When hasWideColorDisplay returns true, this API must return a
252# valid wide color gamut data space.
253# The data space must not be UNKNOWN, if unspecified, the data space
254# is V0_SRGB by default, which essentially indicates there's no wide
255# color gamut, meaning hasWideColorDisplay returns false.
256prop {
257 api_name: "wcg_composition_dataspace"
258 type: Long
Inseob Kim44f34c52019-06-08 20:47:59 +0900259 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900260 access: Readonly
261 prop_name: "ro.surface_flinger.wcg_composition_dataspace"
262}
263
264# wcgPixelFormat is the pixel format that SurfaceFlinger expects for
265# wide color gamut surfaces. If unspecified, the pixel format is
266# PixelFormat::RGBA_8888 by default.
267prop {
268 api_name: "wcg_composition_pixel_format"
269 type: Integer
Inseob Kim44f34c52019-06-08 20:47:59 +0900270 scope: Public
Sundong Ahnd5e08f62018-12-12 20:27:28 +0900271 access: Readonly
272 prop_name: "ro.surface_flinger.wcg_composition_pixel_format"
273}
Sundong Ahn85131bd2019-02-18 15:51:53 +0900274
Yichi Chenda901bf2019-06-28 14:58:27 +0800275# colorSpaceAgnosticDataspace specifies the data space that
276# SurfaceFlinger expects for surfaces which are color space agnostic.
277# The variable works only when useColorManagement is specified. If
278# unspecified, the data space follows what SurfaceFlinger expects for
279# surfaces when useColorManagement is specified.
Alec Mouri88790f32023-07-21 01:25:14 +0000280# DEPRECATED: do not use
Yichi Chenda901bf2019-06-28 14:58:27 +0800281prop {
282 api_name: "color_space_agnostic_dataspace"
283 type: Long
Luca Stefani45e52932019-11-16 14:58:17 +0100284 scope: Public
Yichi Chenda901bf2019-06-28 14:58:27 +0800285 access: Readonly
286 prop_name: "ro.surface_flinger.color_space_agnostic_dataspace"
287}
288
Sundong Ahn85131bd2019-02-18 15:51:53 +0900289# Return the native panel primary data. The data includes red, green,
290# blue and white. The primary format is CIE 1931 XYZ color space.
291# If unspecified, the primaries is sRGB gamut by default.
292
293prop {
294 api_name: "display_primary_red"
295 type: DoubleList
Inseob Kim44f34c52019-06-08 20:47:59 +0900296 scope: Public
Sundong Ahn85131bd2019-02-18 15:51:53 +0900297 access: Readonly
298 prop_name: "ro.surface_flinger.display_primary_red"
299}
300
301prop {
302 api_name: "display_primary_green"
303 type: DoubleList
Inseob Kim44f34c52019-06-08 20:47:59 +0900304 scope: Public
Sundong Ahn85131bd2019-02-18 15:51:53 +0900305 access: Readonly
306 prop_name: "ro.surface_flinger.display_primary_green"
307}
308
309prop {
310 api_name: "display_primary_blue"
311 type: DoubleList
Inseob Kim44f34c52019-06-08 20:47:59 +0900312 scope: Public
Sundong Ahn85131bd2019-02-18 15:51:53 +0900313 access: Readonly
314 prop_name: "ro.surface_flinger.display_primary_blue"
315}
316
317prop {
318 api_name: "display_primary_white"
319 type: DoubleList
Inseob Kim44f34c52019-06-08 20:47:59 +0900320 scope: Public
Sundong Ahn85131bd2019-02-18 15:51:53 +0900321 access: Readonly
322 prop_name: "ro.surface_flinger.display_primary_white"
323}
Ady Abrahambe59c0d2019-03-05 13:01:13 -0800324
Ana Krulec10e02052020-02-04 17:16:10 +0000325# refreshRateSwitching indicates whether SurfaceFlinger should use refresh rate
326# switching on the device, e.g. to switch between 60 and 90 Hz. The settings
327# below that are related to refresh rate switching will only have an effect if
328# refresh_rate_switching is enabled.
329prop {
330 api_name: "refresh_rate_switching"
331 type: Boolean
Luca Stefanifbede972020-06-26 18:58:43 +0200332 scope: Public
Ana Krulec10e02052020-02-04 17:16:10 +0000333 access: Readonly
334 prop_name: "ro.surface_flinger.refresh_rate_switching"
Ana Krulec3f6a2062020-01-23 15:48:01 -0800335 deprecated: true
Ana Krulec10e02052020-02-04 17:16:10 +0000336}
337
Ady Abrahambe59c0d2019-03-05 13:01:13 -0800338prop {
339 api_name: "set_idle_timer_ms"
340 type: Integer
Inseob Kim44f34c52019-06-08 20:47:59 +0900341 scope: Public
Ady Abrahambe59c0d2019-03-05 13:01:13 -0800342 access: Readonly
343 prop_name: "ro.surface_flinger.set_idle_timer_ms"
344}
Ana Krulece5a06e02019-03-06 17:09:03 -0800345
Ady Abraham8532d012019-05-08 14:50:56 -0700346# setTouchTimerMs indicates what is considered a timeout in milliseconds for Scheduler.
347# This value is used by the Scheduler to trigger touch inactivity callbacks that will switch the
348# display to a lower refresh rate. Setting this property to 0 means there is no timer.
349prop {
350 api_name: "set_touch_timer_ms"
351 type: Integer
Inseob Kim44f34c52019-06-08 20:47:59 +0900352 scope: Public
Ady Abraham8532d012019-05-08 14:50:56 -0700353 access: Readonly
354 prop_name: "ro.surface_flinger.set_touch_timer_ms"
355}
356
Ady Abraham6fe2c172019-07-12 12:37:57 -0700357# setDisplayPowerTimerMs indicates what is considered a timeout in milliseconds for Scheduler.
358# This value is used by the Scheduler to trigger display power inactivity callbacks that will
359# keep the display in peak refresh rate as long as display power is not in normal mode.
360# Setting this property to 0 means there is no timer.
361prop {
362 api_name: "set_display_power_timer_ms"
363 type: Integer
Luca Stefani45e52932019-11-16 14:58:17 +0100364 scope: Public
Ady Abraham6fe2c172019-07-12 12:37:57 -0700365 access: Readonly
366 prop_name: "ro.surface_flinger.set_display_power_timer_ms"
367}
368
Ady Abraham48da0702020-02-04 15:59:25 -0800369# useContentDetectionForRefreshRate indicates whether Scheduler should detect content FPS, and try
370# to adjust the screen refresh rate based on that.
371prop {
372 api_name: "use_content_detection_for_refresh_rate"
373 type: Boolean
374 scope: Public
375 access: Readonly
376 prop_name: "ro.surface_flinger.use_content_detection_for_refresh_rate"
377}
378
Ana Krulece5a06e02019-03-06 17:09:03 -0800379# useSmart90ForVideo indicates whether Scheduler should detect content FPS, and try to adjust the
380# screen refresh rate based on that.
Ady Abraham48da0702020-02-04 15:59:25 -0800381# Replaced by useContentDetectionForRefreshRate
Ana Krulece5a06e02019-03-06 17:09:03 -0800382prop {
383 api_name: "use_smart_90_for_video"
384 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900385 scope: Public
Ana Krulece5a06e02019-03-06 17:09:03 -0800386 access: Readonly
387 prop_name: "ro.surface_flinger.use_smart_90_for_video"
Ady Abraham48da0702020-02-04 15:59:25 -0800388 deprecated: true
Ana Krulece5a06e02019-03-06 17:09:03 -0800389}
Peiyong Lin6a043d52019-04-01 17:18:21 -0700390
391prop {
392 api_name: "enable_protected_contents"
393 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900394 scope: Public
Peiyong Lin6a043d52019-04-01 17:18:21 -0700395 access: Readonly
396 prop_name: "ro.surface_flinger.protected_contents"
397}
Alec Mouridc28b372019-04-18 21:17:13 -0700398
399# Indicates whether Scheduler's idle timer should support a display driver timeout in the kernel.
400# The value of set_idle_timer_ms should be shorter in time than the timeout duration in the kernel.
401prop {
402 api_name: "support_kernel_idle_timer"
403 type: Boolean
Inseob Kim44f34c52019-06-08 20:47:59 +0900404 scope: Public
Alec Mouridc28b372019-04-18 21:17:13 -0700405 access: Readonly
406 prop_name: "ro.surface_flinger.support_kernel_idle_timer"
407}
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800408
409# Indicates whether background blurs are supported.
410prop {
411 api_name: "supports_background_blur"
412 type: Boolean
413 scope: Public
414 access: Readonly
415 prop_name: "ro.surface_flinger.supports_background_blur"
416}
Ana Krulec3803b8d2020-02-03 16:35:46 -0800417
Dan Stoza030fbc12020-02-19 15:32:01 -0800418# Sets the timeout used to rate limit DISPLAY_UPDATE_IMMINENT Power HAL notifications.
419# SurfaceFlinger wakeups will trigger this boost whenever they are separated by more than this
420# duration (specified in milliseconds). A value of 0 disables the rate limit, and will result in
421# Power HAL notifications every time SF wakes up.
422prop {
423 api_name: "display_update_imminent_timeout_ms"
424 type: Integer
425 scope: Public
426 access: Readonly
427 prop_name: "ro.surface_flinger.display_update_imminent_timeout_ms"
428}
Marin Shalamanovf8c63722020-10-06 13:11:21 +0200429
430
431# Updates the DeviceProductInfo when a hoplug reconnect event is processed
432prop {
433 api_name: "update_device_product_info_on_hotplug_reconnect"
434 type: Boolean
435 scope: Public
436 access: Readonly
437 prop_name: "ro.surface_flinger.update_device_product_info_on_hotplug_reconnect"
438}
Ady Abraham4899ff82021-01-06 13:53:29 -0800439
440# Enables the frame rate override feature
441prop {
442 api_name: "enable_frame_rate_override"
443 type: Boolean
444 scope: Public
445 access: Readonly
446 prop_name: "ro.surface_flinger.enable_frame_rate_override"
447}
Ady Abraham9c87def2021-02-18 11:25:28 -0800448
449# Enables Layer Caching
450prop {
451 api_name: "enable_layer_caching"
452 type: Boolean
453 scope: Public
454 access: Readonly
455 prop_name: "ro.surface_flinger.enable_layer_caching"
456}
John Reckac09e452021-04-07 16:35:37 -0400457
458# Enables SDR layer dimming
459prop {
460 api_name: "enable_sdr_dimming"
461 type: Boolean
462 scope: Public
463 access: Readonly
464 prop_name: "ro.surface_flinger.enable_sdr_dimming"
John Reck49d9ad32022-02-23 19:03:31 -0500465}
466
467# Ignores Camera layers when calculating HDR coverage information
468prop {
469 api_name: "ignore_hdr_camera_layers"
470 type: Boolean
471 scope: Public
472 access: Readonly
473 prop_name: "ro.surface_flinger.ignore_hdr_camera_layers"
Lloyd Piquea1456c12023-05-17 12:11:15 -0700474}
475
476# Controls the minimum acquired buffers SurfaceFlinger will suggest via
477# ISurfaceComposer.getMaxAcquiredBufferCount().
478prop {
479 api_name: "min_acquired_buffers"
480 type: Long
481 scope: Public
482 access: Readonly
483 prop_name: "ro.surface_flinger.min_acquired_buffers"
484}
Brian Lindahl5b0ffe02023-06-15 14:19:43 -0600485
486# When enabled, SurfaceFlinger will attempt to clear the per-layer HAL buffer cache slots for
487# buffers when they are evicted from the app cache by using additional setLayerBuffer commands.
488# Ideally, this behavior would always be enabled to reduce graphics memory consumption. However,
489# Some HAL implementations may not support the additional setLayerBuffer commands used to clear
490# the cache slots.
491prop {
492 api_name: "clear_slots_with_set_layer_buffer"
493 type: Boolean
494 scope: Public
495 access: Readonly
496 prop_name: "ro.surface_flinger.clear_slots_with_set_layer_buffer"
497}
Andy Yuf06ef952023-10-19 15:25:24 -0700498
499# Controls the default frame rate override of game applications. Ideally, game applications set
500# desired frame rate via setFrameRate() API. However, to cover the scenario when the game didn't
501# have a set frame rate, we introduce the default frame rate. The priority of this override is the
502# lowest among setFrameRate() and game intervention override.
503prop {
504 api_name: "game_default_frame_rate_override"
505 type: Integer
506 scope: Public
507 access: Readonly
508 prop_name: "ro.surface_flinger.game_default_frame_rate_override"
509}