1 /* blf.h
2 *
3 * BLF file format decoder for the Wiretap library.
4 *
5 * Copyright (c) 2021 by Dr. Lars Voelker <lars.voelker@technica-engineering.de>
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10 /*
11 * The following was used as a reference for the file format:
12 * https://bitbucket.org/tobylorenz/vector_blf
13 * The repo above includes multiple examples files as well.
14 */
15
16 #ifndef __W_BLF_H__
17 #define __W_BLF_H__
18
19 #include "wtap.h"
20 #include <epan/value_string.h>
21
22 wtap_open_return_val blf_open(wtap *wth, int *err, gchar **err_info);
23
24
25 #define BLF_HEADER_TYPE_DEFAULT 1
26
27 #define BLF_COMPRESSION_NONE 0
helper_raise_interrupt(CPUX86State * env,int intno,int next_eip_addend)28 #define BLF_COMPRESSION_ZLIB 2
29
30 #define BLF_TIMESTAMP_RESOLUTION_10US 1
31 #define BLF_TIMESTAMP_RESOLUTION_1NS 2
32
33 typedef struct blf_date {
34 guint16 year;
35 guint16 month;
36 guint16 dayofweek;
37 guint16 day;
38 guint16 hour;
39 guint16 mins;
40 guint16 sec;
41 guint16 ms;
42 } blf_date_t;
43
check_exception(CPUX86State * env,int intno,int * error_code,uintptr_t retaddr)44 /* BLF Header */
45 typedef struct blf_fileheader {
46 guint8 magic[4];
47 guint32 header_length;
48
49 guint8 applications[4];
50 guint8 api[4];
51
52 guint64 len_compressed;
53 guint64 len_uncompressed;
54
55 guint32 obj_count;
56 guint32 obj_read;
57
58 blf_date_t start_date;
59 blf_date_t end_date;
60
61 guint32 length3;
62 } blf_fileheader_t;
63
64 typedef struct blf_blockheader {
65 guint8 magic[4];
66 guint16 header_length; /* length of header starting with magic */
67 guint16 header_type; /* header format ? */
68 guint32 object_length; /* complete length including header */
69 guint32 object_type;
70 } blf_blockheader_t;
71
72 typedef struct blf_logcontainerheader {
73 guint16 compression_method; /* 0 uncompressed, 2 zlib */
74 guint16 res1;
75 guint32 res2;
76 guint32 uncompressed_size;
77 guint32 res4;
78 } blf_logcontainerheader_t;
79
80 typedef struct blf_logobjectheader {
81 guint32 flags;
82 guint16 client_index;
83 guint16 object_version;
84 guint64 object_timestamp;
85 } blf_logobjectheader_t;
86
87 typedef struct blf_ethernetframeheader {
88 guint8 src_addr[6];
89 guint16 channel;
raise_interrupt2(CPUX86State * env,int intno,int is_int,int error_code,int next_eip_addend,uintptr_t retaddr)90 guint8 dst_addr[6];
91 guint16 direction;
92 guint16 ethtype;
93 guint16 tpid;
94 guint16 tci;
95 guint16 payloadlength;
96 guint64 res;
97 } blf_ethernetframeheader_t;
98
99 typedef struct blf_ethernetframeheader_ex {
100 guint16 struct_length;
101 guint16 flags;
102 guint16 channel;
103 guint16 hw_channel;
104 guint64 frame_duration;
105 guint32 frame_checksum;
106 guint16 direction;
107 guint16 frame_length;
108 guint32 frame_handle;
109 guint32 error;
110 } blf_ethernetframeheader_ex_t;
111
112 typedef struct blf_wlanframeheader {
113 guint16 channel;
raise_interrupt(CPUX86State * env,int intno,int is_int,int error_code,int next_eip_addend)114 guint16 flags;
115 guint8 direction;
116 guint8 radio_channel;
117 guint16 signal_strength;
118 guint16 signal_quality;
119 guint16 frame_length;
raise_exception_err(CPUX86State * env,int exception_index,int error_code)120 guint32 res;
121 } blf_wlanframeheader_t;
122
123 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/CanMessage.h */
124
125 /* shared for CAN message and CAN message2 and CANFD message */
raise_exception_err_ra(CPUX86State * env,int exception_index,int error_code,uintptr_t retaddr)126 #define BLF_CANMESSAGE_FLAG_TX 0x01
127 #define BLF_CANMESSAGE_FLAG_NERR 0x20
128 #define BLF_CANMESSAGE_FLAG_WU 0x40
129 #define BLF_CANMESSAGE_FLAG_RTR 0x80
130
131 /* shared for CAN message and CAN message2*/
132 typedef struct blf_canmessage {
133 guint16 channel;
134 guint8 flags;
135 guint8 dlc;
136 guint32 id;
137 } blf_canmessage_t;
138
139
140 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/CanMessage2.h */
141
142 typedef struct blf_canmessage2_trailer {
143 guint32 frameLength_in_ns;
144 guint8 bitCount;
145 guint8 reserved1;
146 guint16 reserved2;
147 } blf_canmessage2_trailer_t;
148
149
150 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/CanFdMessage.h */
151
152 /* EDL 0: CAN, 1: CAN-FD*/
153 #define BLF_CANFDMESSAGE_CANFDFLAG_EDL 0x01
154 #define BLF_CANFDMESSAGE_CANFDFLAG_BRS 0x02
155 #define BLF_CANFDMESSAGE_CANFDFLAG_ESI 0x04
156
157 typedef struct blf_canfdmessage {
158 guint16 channel;
159 guint8 flags;
160 guint8 dlc;
161 guint32 id;
162 guint32 frameLength_in_ns;
163 guint8 canfdflags;
164 guint8 validDataBytes;
165 guint8 reservedCanFdMessage1;
166 guint32 reservedCanFdMessage2;
167 /* DATA */
168 /* guint32 reservedCanFdMessage3 */
169 } blf_canfdmessage_t;
170
171
172 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/CanFdMessage64.h */
173
174 #define BLF_CANFDMESSAGE64_FLAG_NERR 0x000004
175 #define BLF_CANFDMESSAGE64_FLAG_HIGH_VOLT_WAKE_UP 0x000008
176 #define BLF_CANFDMESSAGE64_FLAG_REMOTE_FRAME 0x000010
177 #define BLF_CANFDMESSAGE64_FLAG_TX_ACK 0x000040
178 #define BLF_CANFDMESSAGE64_FLAG_TX_REQ 0x000080
179 #define BLF_CANFDMESSAGE64_FLAG_SRR 0x000200
180 #define BLF_CANFDMESSAGE64_FLAG_R0 0x000400
181 #define BLF_CANFDMESSAGE64_FLAG_R1 0x000800
182 /* EDL 0: CAN, 1: CAN-FD*/
183 #define BLF_CANFDMESSAGE64_FLAG_EDL 0x001000
184 #define BLF_CANFDMESSAGE64_FLAG_BRS 0x002000
185 #define BLF_CANFDMESSAGE64_FLAG_ESI 0x004000
186 #define BLF_CANFDMESSAGE64_FLAG_BURST 0x200000
187
188 typedef struct blf_canfdmessage64 {
189 guint8 channel;
190 guint8 dlc;
191 guint8 validDataBytes;
192 guint8 txCount;
193 guint32 id;
194 guint32 frameLength_in_ns;
195 guint32 flags;
196 guint32 btrCfgArb;
197 guint32 btrCfgData;
198 guint32 timeOffsetBrsNs;
199 guint32 timeOffsetCrcDelNs;
200 guint16 bitCount;
201 guint8 dir;
202 guint8 extDataOffset;
203 guint32 crc;
204 } blf_canfdmessage64_t;
205
206
207 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/FlexRayData.h */
208
209 #define BLF_FLEXRAYDATA_FRAME 0x01
210 #define BLF_FLEXRAYDATA_CHANNEL_B 0x80
211
212 typedef struct blf_flexraydata {
213 guint16 channel;
214 guint8 mux;
215 guint8 len;
216 guint16 messageId;
217 guint16 crc;
218 guint8 dir;
219 guint8 reservedFlexRayData1;
220 guint16 reservedFlexRayData2;
221 } blf_flexraydata_t;
222
223
224 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/FlexRayV6Message.h */
225
226 #define BLF_FLEXRAYMESSAGE_DIR_RX 0x01
227 #define BLF_FLEXRAYMESSAGE_DIR_TX 0x02
228 #define BLF_FLEXRAYMESSAGE_DIR_TX_REQ 0x04
229
230 #define BLF_FLEXRAYMESSAGE_STATE_PPI 0x01
231 #define BLF_FLEXRAYMESSAGE_STATE_SFI 0x02
232 #define BLF_FLEXRAYMESSAGE_STATE_RES_BIT2 0x04
233 #define BLF_FLEXRAYMESSAGE_STATE_NFI 0x08
234 #define BLF_FLEXRAYMESSAGE_STATE_STFI 0x10
235 #define BLF_FLEXRAYMESSAGE_STATE_FORMAT 0xe0
236
237 #define BLF_FLEXRAYMESSAGE_HEADER_BIT_NM 0x01
238 #define BLF_FLEXRAYMESSAGE_HEADER_BIT_SYNC 0x02
239 #define BLF_FLEXRAYMESSAGE_HEADER_BIT_RES 0x04
240
241 #define BLF_DLT_FLEXRAY_STFI 0x08
242 #define BLF_DLT_FLEXRAY_SFI 0x10
243 #define BLF_DLT_FLEXRAY_NFI 0x20
244 #define BLF_DLT_FLEXRAY_PPI 0x40
245
246 typedef struct blf_flexraymessage {
247 guint16 channel;
248 guint8 dir; /* Flags: 0 RX, 1 TX, 2 TX Req, 3 internal, 4 internal*/
249 guint8 lowTime;
250 guint32 fpgaTick;
251 guint32 fpgaTickOverflow;
252 guint32 clientIndexFlexRayV6Message;
253 guint32 clusterTime;
254 guint16 frameId;
255 guint16 headerCrc;
256 guint16 frameState;
257 guint8 length;
258 guint8 cycle;
259 guint8 headerBitMask;
260 guint8 reservedFlexRayV6Message1;
261 guint16 reservedFlexRayV6Message2;
262 } blf_flexraymessage_t;
263
264
265 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/FlexRayVFrReceiveMsg.h */
266
267 #define BLF_FLEXRAYRCVMSG_DIR_RX 0x01
268 #define BLF_FLEXRAYRCVMSG_DIR_TX 0x02
269 #define BLF_FLEXRAYRCVMSG_DIR_TX_REQ 0x04
270
271 #define BLF_FLEXRAYRCVMSG_CHANNELMASK_RES 0x00
272 #define BLF_FLEXRAYRCVMSG_CHANNELMASK_A 0x01
273 #define BLF_FLEXRAYRCVMSG_CHANNELMASK_B 0x02
274 #define BLF_FLEXRAYRCVMSG_CHANNELMASK_AB 0x03
275
276 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_NULL_FRAME 0x00000001
277 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_VALID_DATA 0x00000002
278 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_SYNC 0x00000004
279 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_STARTUP 0x00000008
280 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_PAYLOAD_PREAM 0x00000010
281 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_RES_20 0x00000020
282 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_ERROR 0x00000040
283 #define BLF_FLEXRAYRCVMSG_DATA_FLAG_RES_80 0x00000080
284
285 typedef struct blf_flexrayrcvmessage {
286 guint16 channel;
287 guint16 version;
288 guint16 channelMask; /* 0 res, 1 A, 2 B, 3 A+B */
289 guint16 dir; /* 0 RX, 1 TX, 2 TX Req, 3 internal, 4 internal*/ /* high byte reserved! */
290 guint32 clientIndex;
291 guint32 clusterNo;
292 guint16 frameId;
293 guint16 headerCrc1;
294 guint16 headerCrc2;
295 guint16 payloadLength;
296 guint16 payloadLengthValid;
297 guint16 cycle; /* high byte reserved! */
298 guint32 tag;
299 guint32 data;
300 guint32 frameFlags;
301 guint32 appParameter;
302 /* if ext, skip 40 bytes */
303 /* payload bytes */
304 /* guint16 res3 */
305 /* guint32 res4 */
306 } blf_flexrayrcvmessage_t;
307
308
309 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/FlexRayVFrReceiveMsgEx.h */
310
311 /* defines see above BLF_FLEXRAYRCVMSG_* */
312
313 typedef struct blf_flexrayrcvmessageex {
314 guint16 channel;
315 guint16 version;
316 guint16 channelMask; /* 0 res, 1 A, 2 B, 3 A+B */
317 guint16 dir; /* 0 RX, 1 TX, 2 TX Req, 3 internal, 4 internal*/
318 guint32 clientIndex;
319 guint32 clusterNo;
320 guint16 frameId;
321 guint16 headerCrc1;
322 guint16 headerCrc2;
323 guint16 payloadLength;
324 guint16 payloadLengthValid;
325 guint16 cycle;
326 guint32 tag;
327 guint32 data;
328 guint32 frameFlags;
329 guint32 appParameter;
330 guint32 frameCRC;
331 guint32 frameLengthInNs;
332 guint16 frameId1;
333 guint16 pduOffset;
334 guint16 blfLogMask;
335 guint16 res1;
336 guint32 res2;
337 guint32 res3;
338 guint32 res4;
339 guint32 res5;
340 guint32 res6;
341 guint32 res7;
342 /* payload bytes */
343 } blf_flexrayrcvmessageex_t;
344
345
346 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/LinMessage.h */
347
348 typedef struct blf_linmessage {
349 guint16 channel;
350 guint8 id;
351 guint8 dlc;
352 } blf_linmessage_t;
353
354 typedef struct blf_linmessage_trailer {
355 guint8 fsmId;
356 guint8 fsmState;
357 guint8 headerTime;
358 guint8 fullTime;
359 guint16 crc;
360 guint8 dir; /* 0 RX, 1 TX Receipt, 2 TX Req */
361 guint8 res1;
362 guint32 res2;
363 } blf_linmessage_trailer_t;
364
365 /* see https://bitbucket.org/tobylorenz/vector_blf/src/master/src/Vector/BLF/ObjectHeaderBase.h */
366
367 #define BLF_OBJTYPE_UNKNOWN 0
368 #define BLF_OBJTYPE_CAN_MESSAGE 1
369 #define BLF_OBJTYPE_CAN_ERROR 2
370 #define BLF_OBJTYPE_CAN_OVERLOAD 3
371 #define BLF_OBJTYPE_CAN_STATISTIC 4
372 #define BLF_OBJTYPE_APP_TRIGGER 5
373 #define BLF_OBJTYPE_ENV_INTEGER 6
374 #define BLF_OBJTYPE_ENV_DOUBLE 7
375 #define BLF_OBJTYPE_ENV_STRING 8
376 #define BLF_OBJTYPE_ENV_DATA 9
377 #define BLF_OBJTYPE_LOG_CONTAINER 10
378 #define BLF_OBJTYPE_LIN_MESSAGE 11
379 #define BLF_OBJTYPE_LIN_CRC_ERROR 12
380 #define BLF_OBJTYPE_LIN_DLC_INFO 13
381 #define BLF_OBJTYPE_LIN_RCV_ERROR 14
382 #define BLF_OBJTYPE_LIN_SND_ERROR 15
383 #define BLF_OBJTYPE_LIN_SLV_TIMEOUT 16
384 #define BLF_OBJTYPE_LIN_SCHED_MODCH 17
385 #define BLF_OBJTYPE_LIN_SYN_ERROR 18
386 #define BLF_OBJTYPE_LIN_BAUDRATE 19
387 #define BLF_OBJTYPE_LIN_SLEEP 20
388 #define BLF_OBJTYPE_LIN_WAKEUP 21
389 #define BLF_OBJTYPE_MOST_SPY 22
390 #define BLF_OBJTYPE_MOST_CTRL 23
391 #define BLF_OBJTYPE_MOST_LIGHTLOCK 24
392 #define BLF_OBJTYPE_MOST_STATISTIC 25
393 #define BLF_OBJTYPE_FLEXRAY_DATA 29
394 #define BLF_OBJTYPE_FLEXRAY_SYNC 30
395 #define BLF_OBJTYPE_CAN_DRIVER_ERROR 31
396 #define BLF_OBJTYPE_MOST_PKT 32
397 #define BLF_OBJTYPE_MOST_PKT2 33
398 #define BLF_OBJTYPE_MOST_HWMODE 34
399 #define BLF_OBJTYPE_MOST_REG 35
400 #define BLF_OBJTYPE_MOST_GENREG 36
401 #define BLF_OBJTYPE_MOST_NETSTATE 37
402 #define BLF_OBJTYPE_MOST_DATALOST 38
403 #define BLF_OBJTYPE_MOST_TRIGGER 39
404 #define BLF_OBJTYPE_FLEXRAY_CYCLE 40
405 #define BLF_OBJTYPE_FLEXRAY_MESSAGE 41
406 #define BLF_OBJTYPE_LIN_CHECKSUM_INFO 42
407 #define BLF_OBJTYPE_LIN_SPIKE_EVENT 43
408 #define BLF_OBJTYPE_CAN_DRIVER_SYNC 44
409 #define BLF_OBJTYPE_FLEXRAY_STATUS 45
410 #define BLF_OBJTYPE_GPS_EVENT 46
411 #define BLF_OBJTYPE_FLEXRAY_ERROR 47
412 #define BLF_OBJTYPE_FLEXRAY_STATUS2 48
413 #define BLF_OBJTYPE_FLEXRAY_STARTCYCLE 49
414 #define BLF_OBJTYPE_FLEXRAY_RCVMESSAGE 50
415 #define BLF_OBJTYPE_REALTIMECLOCK 51
416 #define BLF_OBJTYPE_LIN_STATISTIC 54
417 #define BLF_OBJTYPE_J1708_MESSAGE 55
418 #define BLF_OBJTYPE_J1708_VIRTUAL_MSG 56
419 #define BLF_OBJTYPE_LIN_MESSAGE2 57
420 #define BLF_OBJTYPE_LIN_SND_ERROR2 58
421 #define BLF_OBJTYPE_LIN_SYN_ERROR2 59
422 #define BLF_OBJTYPE_LIN_CRC_ERROR2 60
423 #define BLF_OBJTYPE_LIN_RCV_ERROR2 61
424 #define BLF_OBJTYPE_LIN_WAKEUP2 62
425 #define BLF_OBJTYPE_LIN_SPIKE_EVENT2 63
426 #define BLF_OBJTYPE_LIN_LONG_DOM_SIG 64
427 #define BLF_OBJTYPE_APP_TEXT 65
428 #define BLF_OBJTYPE_FLEXRAY_RCVMESSAGE_EX 66
429 #define BLF_OBJTYPE_MOST_STATISTICEX 67
430 #define BLF_OBJTYPE_MOST_TXLIGHT 68
431 #define BLF_OBJTYPE_MOST_ALLOCTAB 69
432 #define BLF_OBJTYPE_MOST_STRESS 70
433 #define BLF_OBJTYPE_ETHERNET_FRAME 71
434 #define BLF_OBJTYPE_SYS_VARIABLE 72
435 #define BLF_OBJTYPE_CAN_ERROR_EXT 73
436 #define BLF_OBJTYPE_CAN_DRIVER_ERROR_EXT 74
437 #define BLF_OBJTYPE_LIN_LONG_DOM_SIG2 75
438 #define BLF_OBJTYPE_MOST_150_MESSAGE 76
439 #define BLF_OBJTYPE_MOST_150_PKT 77
440 #define BLF_OBJTYPE_MOST_ETHERNET_PKT 78
441 #define BLF_OBJTYPE_MOST_150_MESSAGE_FRAGMENT 79
442 #define BLF_OBJTYPE_MOST_150_PKT_FRAGMENT 80
443 #define BLF_OBJTYPE_MOST_ETHERNET_PKT_FRAGMENT 81
444 #define BLF_OBJTYPE_MOST_SYSTEM_EVENT 82
445 #define BLF_OBJTYPE_MOST_150_ALLOCTAB 83
446 #define BLF_OBJTYPE_MOST_50_MESSAGE 84
447 #define BLF_OBJTYPE_MOST_50_PKT 85
448 #define BLF_OBJTYPE_CAN_MESSAGE2 86
449 #define BLF_OBJTYPE_LIN_UNEXPECTED_WAKEUP 87
450 #define BLF_OBJTYPE_LIN_SHORT_OR_SLOW_RESPONSE 88
451 #define BLF_OBJTYPE_LIN_DISTURBANCE_EVENT 89
452 #define BLF_OBJTYPE_SERIAL_EVENT 90
453 #define BLF_OBJTYPE_OVERRUN_ERROR 91
454 #define BLF_OBJTYPE_EVENT_COMMENT 92
455 #define BLF_OBJTYPE_WLAN_FRAME 93
456 #define BLF_OBJTYPE_WLAN_STATISTIC 94
457 #define BLF_OBJTYPE_MOST_ECL 95
458 #define BLF_OBJTYPE_GLOBAL_MARKER 96
459 #define BLF_OBJTYPE_AFDX_FRAME 97
460 #define BLF_OBJTYPE_AFDX_STATISTIC 98
461 #define BLF_OBJTYPE_KLINE_STATUSEVENT 99
462 #define BLF_OBJTYPE_CAN_FD_MESSAGE 100
463 #define BLF_OBJTYPE_CAN_FD_MESSAGE_64 101
464 #define BLF_OBJTYPE_ETHERNET_RX_ERROR 102
465 #define BLF_OBJTYPE_ETHERNET_STATUS 103
466 #define BLF_OBJTYPE_CAN_FD_ERROR_64 104
467 #define BLF_OBJTYPE_AFDX_STATUS 106
468 #define BLF_OBJTYPE_AFDX_BUS_STATISTIC 107
469 #define BLF_OBJTYPE_AFDX_ERROR_EVENT 109
470 #define BLF_OBJTYPE_A429_ERROR 110
471 #define BLF_OBJTYPE_A429_STATUS 111
472 #define BLF_OBJTYPE_A429_BUS_STATISTIC 112
473 #define BLF_OBJTYPE_A429_MESSAGE 113
474 #define BLF_OBJTYPE_ETHERNET_STATISTIC 114
475 #define BLF_OBJTYPE_TEST_STRUCTURE 118
476 #define BLF_OBJTYPE_DIAG_REQUEST_INTERPRETATION 119
477 #define BLF_OBJTYPE_ETHERNET_FRAME_EX 120
478 #define BLF_OBJTYPE_ETHERNET_FRAME_FORWARDED 121
479 #define BLF_OBJTYPE_ETHERNET_ERROR_EX 122
480 #define BLF_OBJTYPE_ETHERNET_ERROR_FORWARDED 123
481 #define BLF_OBJTYPE_FUNCTION_BUS 124
482 #define BLF_OBJTYPE_DATA_LOST_BEGIN 125
483 #define BLF_OBJTYPE_DATA_LOST_END 126
484 #define BLF_OBJTYPE_WATER_MARK_EVENT 127
485 #define BLF_OBJTYPE_TRIGGER_CONDITION 128
486 #define BLF_OBJTYPE_CAN_SETTING_CHANGED 129
487 #define BLF_OBJTYPE_DISTRIBUTED_OBJECT_MEMBER 130
488 #define BLF_OBJTYPE_ATTRIBUTE_EVENT 131
489
490 #endif
491
492 /*
493 * Editor modelines - https://www.wireshark.org/tools/modelines.html
494 *
495 * Local variables:
496 * c-basic-offset: 4
497 * tab-width: 8
498 * indent-tabs-mode: nil
499 * End:
500 *
501 * vi: set shiftwidth=4 tabstop=8 expandtab:
502 * :indentSize=4:tabSize=8:noTabs=true:
503 */
504