ota deployment script, lots of other fun goodies too

This commit is contained in:
Thaddeus Hughes
2026-04-27 11:14:03 -05:00
parent 3774cde506
commit 9f4362b5fd
261 changed files with 2153 additions and 206003 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
/build/
/26c3058c23be21cf6f9cc812bd5d0a8907b2ecf2/
*.pyc

View File

@@ -1,2 +0,0 @@
14:52:22.629 == Flashing COM3 ==
14:52:22.631 erase_flash @ COM3

View File

@@ -1,9 +0,0 @@
14:54:20.812 == Flashing COM3 ==
14:54:20.814 erase_flash @ COM3
14:54:23.260 flashing from D:\SC\SC-F001\build
14:54:23.261 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]
14:54:48.002 == Flash complete ==
14:54:49.503 Connecting to COM3 @ 115200 ...
14:54:49.507 -> BU.BEGIN
14:55:24.216 -> BU.FLASH
14:55:50.514 -> BU.END

View File

@@ -1,8 +0,0 @@
15:03:29.132 == Flashing COM3 ==
15:03:29.134 erase_flash @ COM3
15:03:32.409 flashing from D:\SC\SC-F001\build
15:03:32.410 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]
15:03:57.500 == Flash complete ==
15:03:59.001 Connecting to COM3 @ 115200 ...
15:03:59.005 -> BU.BEGIN
15:06:09.840 -> BU.END

View File

@@ -1,27 +0,0 @@
15:08:35.387 == Flashing COM3 ==
15:08:35.388 erase_flash @ COM3
15:08:38.996 flashing from D:\SC\SC-F001\build
15:08:38.998 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]
15:09:04.125 == Flash complete ==
15:09:05.626 Connecting to COM3 @ 115200 ...
15:09:05.631 -> BU.BEGIN
15:09:07.138 -> BU.BEGIN
15:09:08.643 -> BU.BEGIN
15:09:10.151 -> BU.BEGIN
15:09:11.659 -> BU.BEGIN
15:09:13.170 -> BU.BEGIN
15:09:14.679 -> BU.BEGIN
15:09:16.166 -> BU.BEGIN
15:09:17.668 -> BU.BEGIN
15:09:19.177 -> BU.BEGIN
15:09:20.683 -> BU.BEGIN
15:09:22.186 -> BU.BEGIN
15:09:23.708 -> BU.BEGIN
15:09:25.209 -> BU.BEGIN
15:09:26.712 -> BU.BEGIN
15:09:28.237 -> BU.BEGIN
15:09:29.729 -> BU.BEGIN
15:09:31.242 -> BU.BEGIN
15:09:32.729 -> BU.BEGIN
15:09:34.243 -> BU.BEGIN
15:52:17.070 -> BU.END

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +0,0 @@
15:54:04.593 == Flashing COM3 ==
15:54:04.596 flashing from D:\SC\SC-F001\build
15:54:04.596 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]
15:54:29.689 == Flash complete ==
15:54:31.190 Connecting to COM3 @ 115200 ...
15:54:31.194 -> BU.BEGIN
15:54:32.689 -> BU.BEGIN
15:54:34.195 -> BU.BEGIN
15:54:35.694 -> BU.BEGIN
15:54:37.184 -> BU.BEGIN
15:54:38.702 -> BU.BEGIN
15:54:40.202 -> BU.BEGIN
15:54:41.705 -> BU.BEGIN
15:54:43.205 -> BU.BEGIN
15:54:44.723 -> BU.BEGIN
15:54:46.221 -> BU.BEGIN
15:54:47.736 -> BU.BEGIN
15:54:49.243 -> BU.BEGIN
15:54:50.737 -> BU.BEGIN
15:54:52.244 -> BU.BEGIN
15:54:53.755 -> BU.BEGIN
15:54:55.253 -> BU.BEGIN
15:54:56.748 -> BU.BEGIN
15:54:58.262 -> BU.BEGIN
15:54:59.769 -> BU.BEGIN
15:55:09.125 -> BU.END

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,565 +0,0 @@
16:40:50.654 Connecting to COM3 @ 115200 ...
16:40:50.659 -> BU.BEGIN
16:40:50.660 <-
16:40:50.660 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.661 <-
16:40:50.661 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.661 <-
16:40:50.661 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.662 <-
16:40:50.662 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.663 <-
16:40:50.664 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.664 <-
16:40:50.664 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.664 <-
16:40:50.664 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.676 <-
16:40:50.676 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.676 <-
16:40:50.677 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.678 <-
16:40:50.678 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.679 <-
16:40:50.679 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.680 <-
16:40:50.680 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.680 <-
16:40:50.680 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.681 <-
16:40:50.682 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.682 <-
16:40:50.682 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.682 <-
16:40:50.682 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.683 <-
16:40:50.683 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.684 <-
16:40:50.684 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.685 <-
16:40:50.685 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.686 <-
16:40:50.686 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.688 <-
16:40:50.688 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.689 <-
16:40:50.689 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.690 <-
16:40:50.691 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.692 <-
16:40:50.692 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.693 <-
16:40:50.693 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.694 <-
16:40:50.694 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.694 <-
16:40:50.695 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.695 <-
16:40:50.695 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.695 <-
16:40:50.696 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.697 <-
16:40:50.697 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.697 <-
16:40:50.697 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.698 <-
16:40:50.698 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.699 <-
16:40:50.699 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.699 <-
16:40:50.699 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.700 <-
16:40:50.700 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.701 <-
16:40:50.701 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.701 <-
16:40:50.701 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.702 <-
16:40:50.702 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.703 <-
16:40:50.703 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.706 <-
16:40:50.706 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.707 <-
16:40:50.708 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.708 <-
16:40:50.708 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.709 <-
16:40:50.709 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.709 <-
16:40:50.709 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.710 <-
16:40:50.711 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.711 <-
16:40:50.711 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.712 <-
16:40:50.712 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.712 <-
16:40:50.712 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.713 <-
16:40:50.713 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.713 <-
16:40:50.714 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.714 <-
16:40:50.714 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.715 <-
16:40:50.715 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.715 <-
16:40:50.715 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.716 <-
16:40:50.717 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.717 <-
16:40:50.717 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.717 <-
16:40:50.718 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.718 <-
16:40:50.718 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.719 <-
16:40:50.719 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.721 <-
16:40:50.722 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.723 <-
16:40:50.723 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.724 <-
16:40:50.724 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.725 <-
16:40:50.725 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.725 <-
16:40:50.726 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.726 <-
16:40:50.726 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.727 <-
16:40:50.727 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.728 <-
16:40:50.728 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.728 <-
16:40:50.728 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.729 <-
16:40:50.730 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.730 <-
16:40:50.730 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.731 <-
16:40:50.731 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.731 <-
16:40:50.731 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.732 <-
16:40:50.732 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.732 <-
16:40:50.733 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.733 <-
16:40:50.733 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.733 <-
16:40:50.733 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.734 <-
16:40:50.734 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.734 <-
16:40:50.735 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.736 <-
16:40:50.736 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.737 <-
16:40:50.737 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.739 <-
16:40:50.739 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.739 <-
16:40:50.740 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.740 <-
16:40:50.740 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.741 <-
16:40:50.741 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.742 <-
16:40:50.742 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.742 <-
16:40:50.742 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.743 <-
16:40:50.744 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.744 <-
16:40:50.744 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.744 <-
16:40:50.744 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.745 <-
16:40:50.745 <- E rmt: hw buffer too small, received symbols truncated
16:40:50.746 <-
16:40:51.249 <- E rmt: hw buffer too small, received symbols truncated
16:40:51.249 <- BU.BEGIN
16:40:51.251 <-
16:40:51.251 <- BU.OK begin fw=a775999-dirty board=V5 t=0.00
16:40:51.254 -> BU.INFO
16:40:51.254 <- E rmt: hw buffer too small, received symbols truncated
16:40:51.254 <- E rmt: hw buffer too small, received symbols truncated
16:40:51.763 <- BU.OK info reset=SW heap=68572 min_heap=68072 fw=a775999-dirty build=2026-04-22 21:25:54
16:40:53.500 -> BU.FLASH
16:40:53.500 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.500 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.501 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.501 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.501 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.501 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.502 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.502 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.502 <- I (24479) BT_HID: Found 0 HID device(s)
16:40:53.502 <- I (24479) BT_HID: No HID devices found, retrying in 2000ms...
16:40:53.502 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.502 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.502 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.502 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.502 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.503 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.503 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.503 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.503 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.503 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.527 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.527 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.527 <- E rmt: hw buffer too small, received symbols truncated
16:40:53.527 <- E rmt: hw buffer too small, received symbols truncated
16:40:54.028 <- BU.OK flash post_part=roundtrip log_head=131 log_tail=0 partitions_size=4128768
16:40:54.796 -> BU.I2C
16:40:54.796 <- E rmt: hw buffer too small, received symbols truncated
16:40:54.796 <- E rmt: hw buffer too small, received symbols truncated
16:40:54.796 <- E rmt: hw buffer too small, received symbols truncated
16:40:54.820 <- E rmt: hw buffer too small, received symbols truncated
16:40:54.820 <- E rmt: hw buffer too small, received symbols truncated
16:40:54.820 <- E rmt: hw buffer too small, received symbols truncated
16:40:54.820 <- I (26479) BT_HID: Scanning for HID devices (3s)...
16:40:55.300 <- I (26849) I2C: POST: TCA9555 OK (port0=0x01E3)
16:40:55.300 <- BU.OK i2c tca9555=ack
16:40:55.303 -> BU.LED 0
16:40:55.303 <- E rmt: hw buffer too small, received symbols truncated
16:40:55.303 <- E rmt: hw buffer too small, received symbols truncated
16:40:55.303 <- E rmt: hw buffer too small, received symbols truncated
16:40:55.820 <- E rmt: hw buffer too small, received symbols truncated
16:40:55.820 <- BU.OK led mask=0
16:40:56.070 -> BU.LED 1
16:40:56.316 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.316 <- BU.OK led mask=1
16:40:56.567 -> BU.LED 3
16:40:56.567 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.567 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.567 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.659 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.659 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.659 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.659 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.659 <- BU.OK led mask=3
16:40:56.910 -> BU.LED 7
16:40:56.929 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.930 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.930 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.930 <- E rmt: hw buffer too small, received symbols truncated
16:40:56.930 <- BU.OK led mask=7
16:40:57.180 -> BU.LED 6
16:40:57.296 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.296 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.296 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.296 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.296 <- BU.OK led mask=6
16:40:57.547 -> BU.LED 4
16:40:57.547 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.547 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.547 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.547 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.547 <- I (29489) BT_HID: Found 0 HID device(s)
16:40:57.884 <- I (29489) BT_HID: No HID devices found, retrying in 2000ms...
16:40:57.884 <- E rmt: hw buffer too small, received symbols truncated
16:40:57.884 <- BU.OK led mask=4
16:40:58.134 -> BU.LED 0
16:40:58.134 <- E rmt: hw buffer too small, received symbols truncated
16:40:58.134 <- E rmt: hw buffer too small, received symbols truncated
16:40:58.556 <- E rmt: hw buffer too small, received symbols truncated
16:40:58.556 <- E rmt: hw buffer too small, received symbols truncated
16:40:58.556 <- E rmt: hw buffer too small, received symbols truncated
16:40:58.556 <- E rmt: hw buffer too small, received symbols truncated
16:40:58.556 <- BU.OK led mask=0
16:40:58.807 -> BU.LED 1
16:40:59.313 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.313 <- BU.OK led mask=1
16:40:59.564 -> BU.LED 3
16:40:59.564 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.564 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.564 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.564 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.564 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.564 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.565 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.565 <- I (31489) BT_HID: Scanning for HID devices (3s)...
16:40:59.932 <- E rmt: hw buffer too small, received symbols truncated
16:40:59.932 <- BU.OK led mask=3
16:41:00.183 -> BU.LED 7
16:41:00.183 <- E rmt: hw buffer too small, received symbols truncated
16:41:00.183 <- E rmt: hw buffer too small, received symbols truncated
16:41:00.183 <- E rmt: hw buffer too small, received symbols truncated
16:41:00.690 <- E rmt: hw buffer too small, received symbols truncated
16:41:00.690 <- E rmt: hw buffer too small, received symbols truncated
16:41:00.690 <- E rmt: hw buffer too small, received symbols truncated
16:41:00.690 <- E rmt: hw buffer too small, received symbols truncated
16:41:00.690 <- BU.OK led mask=7
16:41:00.941 -> BU.LED 6
16:41:01.255 <- BU.OK led mask=6
16:41:01.506 -> BU.LED 4
16:41:01.506 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.506 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.506 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.506 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.507 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.507 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.507 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.507 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.849 <- E rmt: hw buffer too small, received symbols truncated
16:41:01.849 <- BU.OK led mask=4
16:41:02.100 -> BU.LED 0
16:41:02.100 <- E rmt: hw buffer too small, received symbols truncated
16:41:02.100 <- E rmt: hw buffer too small, received symbols truncated
16:41:02.100 <- E rmt: hw buffer too small, received symbols truncated
16:41:02.100 <- E rmt: hw buffer too small, received symbols truncated
16:41:02.476 <- E rmt: hw buffer too small, received symbols truncated
16:41:02.476 <- E rmt: hw buffer too small, received symbols truncated
16:41:02.476 <- E rmt: hw buffer too small, received symbols truncated
16:41:02.476 <- BU.OK led mask=0
16:41:02.727 -> BU.LED 1
16:41:02.727 <- I (34499) BT_HID: Found 0 HID device(s)
16:41:03.105 <- I (34499) BT_HID: No HID devices found, retrying in 2000ms...
16:41:03.105 <- BU.OK led mask=1
16:41:03.356 -> BU.LED 3
16:41:03.356 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.356 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.356 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.363 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.363 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.363 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.363 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.697 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.697 <- BU.OK led mask=3
16:41:03.948 -> BU.LED 7
16:41:03.948 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.948 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.948 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.948 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.948 <- E rmt: hw buffer too small, received symbols truncated
16:41:03.949 <- E rmt: hw buffer too small, received symbols truncated

View File

@@ -1,367 +0,0 @@
17:13:09.734 == Flashing COM3 ==
17:13:09.736 flashing from D:\SC\SC-F001\build
17:13:09.737 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]
17:13:34.882 == Flash complete ==
17:13:36.383 Connecting to COM3 @ 115200 ...
17:13:36.389 -> BU.BEGIN
17:13:36.895 <- BU.BEGIN
17:13:36.895 <-
17:13:36.895 <- BU.OK begin fw=a775999-dirty board=V5 t=0.00
17:13:36.897 -> BU.INFO
17:13:36.897 <- E rmt: hw buffer too small, received symbols truncated
17:13:36.897 <- E rmt: hw buffer too small, received symbols truncated
17:13:36.897 <- E rmt: hw buffer too small, received symbols truncated
17:13:37.412 <- BU.OK info reset=POWERON heap=68276 min_heap=67772 fw=a775999-dirty build=2026-04-22 21:25:54
17:13:50.053 -> BU.FLASH
17:13:50.053 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.054 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.054 <- I (4419) BT_HID: Found 0 HID device(s)
17:13:50.054 <- I (4419) BT_HID: No HID devices found, retrying in 2000ms...
17:13:50.054 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.055 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.055 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.055 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.055 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- I (6419) BT_HID: Scanning for HID devices (3s)...
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.056 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.057 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.057 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.057 <- I (9429) BT_HID: Found 0 HID device(s)
17:13:50.057 <- I (9429) BT_HID: No HID devices found, retrying in 2000ms...
17:13:50.057 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- I (11429) BT_HID: Scanning for HID devices (3s)...
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.058 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.059 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.059 <- I (14439) BT_HID: Found 0 HID device(s)
17:13:50.059 <- I (14439) BT_HID: No HID devices found, retrying in 2000ms...
17:13:50.059 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.085 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.085 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.085 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.086 <- E rmt: hw buffer too small, received symbols truncated
17:13:50.593 <- BU.OK flash post_part=roundtrip log_head=164 log_tail=0 partitions_size=4128768
17:13:52.197 -> BU.I2C
17:13:52.198 <- E rmt: hw buffer too small, received symbols truncated
17:13:52.198 <- E rmt: hw buffer too small, received symbols truncated
17:13:52.709 <- I (16439) BT_HID: Scanning for HID devices (3s)...
17:13:52.709 <- E rmt: hw buffer too small, received symbols truncated
17:13:52.709 <- I (17459) I2C: POST: TCA9555 OK (port0=0x0123)
17:13:52.709 <- BU.OK i2c tca9555=ack
17:13:52.710 -> BU.LED 0
17:13:53.226 <- BU.OK led mask=0
17:13:53.477 -> BU.LED 1
17:13:53.477 <- E rmt: hw buffer too small, received symbols truncated
17:13:53.983 <- E rmt: hw buffer too small, received symbols truncated
17:13:53.983 <- E rmt: hw buffer too small, received symbols truncated
17:13:53.983 <- BU.OK led mask=1
17:13:54.233 -> BU.LED 3
17:13:54.233 <- E rmt: hw buffer too small, received symbols truncated
17:13:54.439 <- E rmt: hw buffer too small, received symbols truncated
17:13:54.439 <- I (19449) BT_HID: Found 0 HID device(s)
17:13:54.439 <- I (19449) BT_HID: No HID devices found, retrying in 2000ms...
17:13:54.439 <- BU.OK led mask=3
17:13:54.690 -> BU.LED 7
17:13:54.690 <- E rmt: hw buffer too small, received symbols truncated
17:13:55.193 <- E rmt: hw buffer too small, received symbols truncated
17:13:55.193 <- BU.OK led mask=7
17:13:55.444 -> BU.LED 6
17:13:55.444 <- E rmt: hw buffer too small, received symbols truncated
17:13:55.959 <- BU.OK led mask=6
17:13:56.209 -> BU.LED 4
17:13:56.209 <- E rmt: hw buffer too small, received symbols truncated
17:13:56.535 <- E rmt: hw buffer too small, received symbols truncated
17:13:56.536 <- E rmt: hw buffer too small, received symbols truncated
17:13:56.536 <- E rmt: hw buffer too small, received symbols truncated
17:13:56.536 <- I (21449) BT_HID: Scanning for HID devices (3s)...
17:13:56.536 <- BU.OK led mask=4
17:13:56.787 -> BU.LED 0
17:13:57.251 <- E rmt: hw buffer too small, received symbols truncated
17:13:57.251 <- BU.OK led mask=0
17:13:57.502 -> BU.LED 1
17:13:57.502 <- E rmt: hw buffer too small, received symbols truncated
17:13:57.502 <- E rmt: hw buffer too small, received symbols truncated
17:13:57.502 <- E rmt: hw buffer too small, received symbols truncated
17:13:57.984 <- E rmt: hw buffer too small, received symbols truncated
17:13:57.984 <- E rmt: hw buffer too small, received symbols truncated
17:13:57.984 <- E rmt: hw buffer too small, received symbols truncated
17:13:57.984 <- BU.OK led mask=1
17:13:58.234 -> BU.LED 3
17:13:58.234 <- E rmt: hw buffer too small, received symbols truncated
17:13:58.744 <- E rmt: hw buffer too small, received symbols truncated
17:13:58.744 <- BU.OK led mask=3
17:13:58.994 -> BU.LED 7
17:13:59.509 <- BU.OK led mask=7
17:13:59.760 -> BU.LED 6
17:13:59.760 <- I (24459) BT_HID: Found 0 HID device(s)
17:13:59.760 <- I (24459) BT_HID: No HID devices found, retrying in 2000ms...
17:14:00.261 <- E rmt: hw buffer too small, received symbols truncated
17:14:00.261 <- E rmt: hw buffer too small, received symbols truncated
17:14:00.261 <- BU.OK led mask=6
17:14:00.512 -> BU.LED 4
17:14:00.512 <- E rmt: hw buffer too small, received symbols truncated
17:14:01.014 <- BU.OK led mask=4
17:14:01.264 -> BU.LED 0
17:14:01.465 <- E rmt: hw buffer too small, received symbols truncated
17:14:01.465 <- E rmt: hw buffer too small, received symbols truncated
17:14:01.465 <- I (26459) BT_HID: Scanning for HID devices (3s)...
17:14:01.465 <- BU.OK led mask=0
17:14:01.716 -> BU.LED 1
17:14:01.716 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.084 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.084 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.084 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.084 <- BU.OK led mask=1
17:14:02.335 -> BU.LED 3
17:14:02.335 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.849 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.849 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.849 <- E rmt: hw buffer too small, received symbols truncated
17:14:02.849 <- BU.OK led mask=3
17:14:03.099 -> BU.LED 7
17:14:03.099 <- E rmt: hw buffer too small, received symbols truncated
17:14:03.602 <- BU.OK led mask=7
17:14:03.852 -> BU.LED 6
17:14:03.852 <- E rmt: hw buffer too small, received symbols truncated
17:14:03.852 <- E rmt: hw buffer too small, received symbols truncated
17:14:04.237 <- E rmt: hw buffer too small, received symbols truncated
17:14:04.237 <- E rmt: hw buffer too small, received symbols truncated
17:14:04.237 <- BU.OK led mask=6
17:14:04.489 -> BU.LED 4
17:14:04.489 <- I (29469) BT_HID: Found 0 HID device(s)
17:14:04.489 <- I (29469) BT_HID: No HID devices found, retrying in 2000ms...
17:14:04.839 <- E rmt: hw buffer too small, received symbols truncated
17:14:04.839 <- BU.OK led mask=4
17:14:05.090 -> BU.LED 0
17:14:05.090 <- E rmt: hw buffer too small, received symbols truncated
17:14:05.090 <- E rmt: hw buffer too small, received symbols truncated
17:14:05.090 <- E rmt: hw buffer too small, received symbols truncated
17:14:05.596 <- E rmt: hw buffer too small, received symbols truncated
17:14:05.596 <- E rmt: hw buffer too small, received symbols truncated
17:14:05.596 <- BU.OK led mask=0
17:14:05.847 -> BU.LED 1
17:14:05.847 <- E rmt: hw buffer too small, received symbols truncated
17:14:05.847 <- E rmt: hw buffer too small, received symbols truncated
17:14:06.360 <- E rmt: hw buffer too small, received symbols truncated
17:14:06.360 <- E rmt: hw buffer too small, received symbols truncated
17:14:06.360 <- BU.OK led mask=1
17:14:06.612 -> BU.LED 3
17:14:06.612 <- E rmt: hw buffer too small, received symbols truncated
17:14:06.612 <- I (31469) BT_HID: Scanning for HID devices (3s)...
17:14:07.125 <- BU.OK led mask=3
17:14:07.376 -> BU.LED 7
17:14:07.878 <- BU.OK led mask=7
17:14:08.128 -> BU.LED 0
17:14:08.128 <- E rmt: hw buffer too small, received symbols truncated
17:14:08.623 <- E rmt: hw buffer too small, received symbols truncated
17:14:08.623 <- E rmt: hw buffer too small, received symbols truncated
17:14:08.623 <- BU.OK led mask=0
17:14:12.509 -> BU.ADC
17:14:12.510 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.510 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.510 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.511 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.511 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.511 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.511 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.511 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.511 <- I (34479) BT_HID: Found 0 HID device(s)
17:14:12.511 <- I (34479) BT_HID: No HID devices found, retrying in 2000ms...
17:14:12.511 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.512 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.512 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.512 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.512 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.513 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.514 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.514 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.514 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.514 <- E rmt: hw buffer too small, received symbols truncated
17:14:12.514 <- E rmt: hw buffer too small, received symbols truncated

View File

@@ -1,375 +0,0 @@
17:18:21.245 Connecting to COM3 @ 115200 ...
17:18:21.251 -> BU.BEGIN
17:18:21.252 <- symbols truncated
17:18:21.252 <- E rmt: hsbu<62>symbols truncated
17:18:21.253 <- E rmt: hsbu<62>symbols truncated
17:18:21.254 <- E rmt: hsbu<62>symbols truncated
17:18:21.255 <- E rmt: hsbu<62>symbols truncated
17:18:21.255 <- E rmt: hsbu<62>symbols truncated
17:18:21.258 <- E rmt: hsbu<62>symbols truncated
17:18:21.258 <- E rmt: hsbu<62>symbols truncated
17:18:21.260 <- E rmt: hsbu<62>symbols truncated
17:18:21.260 <- E rmt: hsbu<62>symbols truncated
17:18:21.261 <- E rmt: hsbu<62>symbols truncated
17:18:21.262 <- E rmt: hsbu<62>symbols truncated
17:18:21.263 <- E rmt: hsbu<62>symbols truncated
17:18:21.275 <- E rmt: hsbu<62>symbols truncated
17:18:21.275 <- E rmt: hsbu<62>symbols truncated
17:18:21.276 <- E rmt: hsbu<62>symbols truncated
17:18:21.278 <- E rmt: hsbu<62>symbols truncated
17:18:21.278 <- E rmt: hsbu<62>symbols truncated
17:18:21.278 <- E rmt: hsbu<62>symbols truncated
17:18:21.279 <- E rmt: hsbu<62>symbols truncated
17:18:21.280 <- E rmt: hsbu<62>symbols truncated
17:18:21.280 <- E rmt: hsbu<62>symbols truncated
17:18:21.281 <- E rmt: hsbu<62>symbols truncated
17:18:21.282 <- E rmt: hsbu<62>symbols truncated
17:18:21.283 <- E rmt: hsbu<62>symbols truncated
17:18:21.283 <- E rmt: hsbu<62>symbols truncated
17:18:21.285 <- E rmt: hsbu<62>symbols truncated
17:18:21.286 <- E rmt: hsbu<62>symbols truncated
17:18:21.288 <- E rmt: hsbu<62>symbols truncated
17:18:21.289 <- E rmt: hsbu<62>symbols truncated
17:18:21.290 <- E rmt: hsbu<62>symbols truncated
17:18:21.291 <- E rmt: hsbu<62>symbols truncated
17:18:21.292 <- E rmt: hsbu<62>symbols truncated
17:18:21.409 <- E rmt: hsbu<62>symbols truncated
17:18:21.409 <- E rmt: hsbu<62>symbols truncated
17:18:21.410 <- E rmt: hsbu<62>symbols truncated
17:18:21.412 <- E rmt: hsbu<62>ɲ<EFBFBD><C9B2><EFBFBD> small, received symbols truncated
17:18:21.413 <- BU.BEGIN
17:18:21.413 <-
17:18:21.413 <- BU.OK begin fw=a775999-dirty board=V5 t=0.00
17:18:21.414 -> BU.INFO
17:18:21.414 <- E rmt: hw buffer too small, received symbols truncated
17:18:21.637 <- E rmt: hw buffer too small, received symbols truncated
17:18:21.637 <- BU.OK info reset=SW heap=84048 min_heap=67828 fw=a775999-dirty build=2026-04-22 21:25:54
17:18:23.380 -> BU.FLASH
17:18:23.381 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.381 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.381 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.381 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.381 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.381 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.382 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.382 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.382 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.382 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.382 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.383 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.384 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.384 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.384 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.384 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.434 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.434 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.434 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.434 <- E rmt: hw buffer too small, received symbols truncated
17:18:23.434 <- BU.OK flash post_part=roundtrip log_head=175 log_tail=0 partitions_size=4128768
17:18:27.978 -> BU.SENSORS.WATCH 0
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.979 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.980 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.980 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.980 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.980 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.981 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.982 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.982 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.982 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.982 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.982 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.983 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.983 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.983 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.983 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.983 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.984 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.984 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.984 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.984 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.985 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.986 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.986 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.986 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.986 <- E rmt: hw buffer too small, received symbols truncated
17:18:27.986 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.033 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.033 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.033 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.033 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.457 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.457 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.457 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.457 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.457 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.973 <- E rmt: hw buffer too small, received symbols truncated
17:18:28.973 <- E rmt: hw buffer too small, received symbols truncated
17:18:29.485 <- E rmt: hw buffer too small, received symbols truncated
17:18:29.485 <- E rmt: hw buffer too small, received symbols truncated
17:18:29.885 <- E rmt: hw buffer too small, received symbols truncated
17:18:29.885 <- E rmt: hw buffer too small, received symbols truncated
17:18:29.885 <- E rmt: hw buffer too small, received symbols truncated
17:18:29.885 <- E rmt: hw buffer too small, received symbols truncated
17:18:30.395 <- E rmt: hw buffer too small, received symbols truncated
17:18:30.395 <- E rmt: hw buffer too small, received symbols truncated
17:18:30.395 <- E rmt: hw buffer too small, received symbols truncated
17:18:30.395 <- E rmt: hw buffer too small, received symbols truncated
17:18:30.395 <- E rmt: hw buffer too small, received symbols truncated
17:18:30.910 <- E rmt: hw buffer too small, received symbols truncated
17:18:30.910 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.405 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.405 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.405 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.405 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.911 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.911 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.911 <- E rmt: hw buffer too small, received symbols truncated
17:18:31.911 <- E rmt: hw buffer too small, received symbols truncated
17:18:32.414 <- E rmt: hw buffer too small, received symbols truncated
17:18:32.414 <- E rmt: hw buffer too small, received symbols truncated
17:18:32.414 <- E rmt: hw buffer too small, received symbols truncated
17:18:32.753 <- E rmt: hw buffer too small, received symbols truncated
17:18:32.753 <- E rmt: hw buffer too small, received symbols truncated
17:18:32.753 <- E rmt: hw buffer too small, received symbols truncated
17:18:32.753 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.082 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.082 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.082 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.082 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.082 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.228 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.228 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.228 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.228 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.741 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.741 <- BU.EVENT sensor name=SAFETY edge=make t=12.01
17:18:33.741 <- BU.EVENT sensor name=SAFETY edge=break t=12.19
17:18:33.742 <- E rmt: hw buffer too small, received symbols truncated
17:18:33.742 <- BU.EVENT sensor name=SAFETY edge=make t=12.40
17:18:34.199 <- BU.EVENT sensor name=SAFETY edge=break t=12.52
17:18:34.199 <- E rmt: hw buffer too small, received symbols truncated
17:18:34.200 <- E rmt: hw buffer too small, received symbols truncated
17:18:34.200 <- E rmt: hw buffer too small, received symbols truncated
17:18:34.707 <- E rmt: hw buffer too small, received symbols truncated
17:18:34.707 <- E rmt: hw buffer too small, received symbols truncated
17:18:34.707 <- E rmt: hw buffer too small, received symbols truncated
17:18:34.893 ->
17:18:35.222 <- BU.OK sensors.watch sec=-1 SAFETY=both DRIVE=none JACK=none AUX=none
17:18:39.477 -> BU.RELAY SENSORS ON 200
17:18:39.478 <- E rmt: hw buffer too small, received symbols truncated

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,460 +0,0 @@
18:06:05.925 == Flashing COM3 ==
18:06:05.927 flashing from D:\SC\SC-F001\build
18:06:05.928 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]
18:06:30.772 == Flash complete ==
18:06:32.274 Connecting to COM3 @ 115200 ...
18:06:32.279 -> BU.BEGIN
18:06:32.473 <- BU.BEGIN
18:06:32.473 <-
18:06:32.473 <- BU.OK begin fw=a775999-dirty board=V5 t=0.00
18:06:32.474 -> BU.INFO
18:06:32.475 <- I (1699) SENS: SAFETY BREAK - Relays disabled
18:06:32.475 <- I (1809) BT_HID: Scanning for HID devices (3s)...
18:06:32.475 <- I (1809) BT_HID: BLE HID host initialised
18:06:32.492 <- I (1809) WEBSERVER: Initializing webserver...
18:06:32.492 <- I (1809) WEBSERVER: AP LAUNCHING
18:06:32.492 <- I (1829) wifi:wifi driver task: 3ffe2828, prio:23, stack:6656, core=0
18:06:32.492 <- I (1829) wifi:wifi firmware version: ccaebfa
18:06:32.492 <- I (1829) wifi:wifi certification version: v7.0
18:06:32.514 <- I (1829) wifi:config NVS flash: enabled
18:06:32.514 <- I (1829) wifi:config nano formating: disabled
18:06:32.514 <- I (1839) wifi:Init data frame dynamic rx buffer num: 32
18:06:32.514 <- I (1839) wifi:Init static rx mgmt buffer num: 5
18:06:32.540 <- I (1849) wifi:BU.OK info reset=POWERON heap=111764 min_heap=111764 fw=a775999-dirty build=2026-04-22 21:25:54
18:06:32.541 <- Init management short buffer num: 32
18:06:32.541 <- I (1859) wifi:Init dynamic tx buffer num: 32
18:06:32.541 <- I (1859) wifi:Init static rx buffer size: 1600
18:06:32.541 <- I (1869) wifi:Init static rx buffer num: 10
18:06:32.562 <- I (1869) wifi:Init dynamic rx buffer num: 32
18:06:32.562 <- I (1879) wifi_init: rx ba win: 6
18:06:32.562 <- I (1879) wifi_init: accept mbox: 6
18:06:32.562 <- I (1879) wifi_init: tcpip mbox: 32
18:06:32.562 <- I (1889) wifi_init: udp mbox: 6
18:06:32.562 <- I (1889) wifi_init: tcp mbox: 6
18:06:32.861 <- I (1889) wifi_init: tcp tx win: 5760
18:06:32.861 <- I (1899) wifi_init: tcp rx win: 5760
18:06:32.861 <- I (1899) wifi_init: tcp mss: 1440
18:06:32.861 <- I (2189) wifi:mode : softAP (80:f3:da:65:25:f9)
18:06:32.861 <- I (2199) wifi:Total power save buffer number: 16
18:06:32.882 <- I (2199) wifi:Init max length of beacon: 752/752
18:06:32.882 <- I (2199) wifi:Init max length of beacon: 752/752
18:06:32.882 <- I (2209) esp_netif_lwip: DHCP server started on interface WIFI_AP_DEF with IP: 192.168.4.1
18:06:32.882 <- I (2209) DNS_SERVER: DNS server started on port 53
18:06:32.903 <- I (2219) mdns_mem: mDNS task will be created from internal RAM
18:06:32.903 <- I (2219) WEBSERVER: SoftAP ready. SSID: sc.local, Channel: 6, Password: password
18:06:32.904 <- I (2229) WEBSERVER: Access at: http://sc.local.local or http://192.168.4.1
18:06:32.925 <- I (2239) WEBSERVER: STARTING HTTP
18:06:32.925 <- I (2249) WEBSERVER: HTTP server started successfully
18:06:32.925 <- I (2249) WEBSERVER: Registered URI handler: /
18:06:32.925 <- I (2249) WEBSERVER: Registered URI handler: /get
18:06:33.431 <- I (2259) WEBSERVER: Registered URI handler: /post
18:06:33.431 <- I (2259) WEBSERVER: Registered URI handler: /log
18:06:33.431 <- I (2269) WEBSERVER: Registered URI handler: /ota
18:06:33.431 <- I (2269) WEBSERVER: Registered URI handler: /*
18:06:33.431 <- I (2279) WEBSERVER: Webserver initialization complete
18:06:35.470 <- E rmt: hw buffer too small, received symbols truncated
18:06:35.976 <- I (4819) BT_HID: Found 0 HID device(s)
18:06:35.976 <- I (4819) BT_HID: No HID devices found, retrying in 2000ms...
18:06:36.482 <- E rmt: hw buffer too small, received symbols truncated
18:06:45.048 -> BU.BEGIN
18:06:45.049 <- I (6819) BT_HID: Scanning for HID devices (3s)...
18:06:45.049 <- E rmt: hw buffer too small, received symbols truncated
18:06:45.050 <- I (9829) BT_HID: Found 0 HID device(s)
18:06:45.052 <- I (9829) BT_HID: No HID devices found, retrying in 2000ms...
18:06:45.492 <- E rmt: hw buffer too small, received symbols truncated
18:06:45.492 <- I (11829) BT_HID: Scanning for HID devices (3s)...
18:06:45.493 <- E rmt: hw buffer too small, received symbols truncated
18:06:45.496 <- BU.OK begin fw=a775999-dirty board=V5 t=0.00
18:06:45.496 -> BU.INFO
18:06:45.997 <- I (14839) BT_HID: Found 0 HID device(s)
18:06:45.997 <- I (14839) BT_HID: No HID devices found, retrying in 2000ms...
18:06:45.997 <- BU.OK info reset=POWERON heap=68372 min_heap=67540 fw=a775999-dirty build=2026-04-22 21:25:54
18:06:49.092 -> BU.FLASH
18:06:49.120 <- E rmt: hw buffer too small, received symbols truncated
18:06:49.120 <- E rmt: hw buffer too small, received symbols truncated
18:06:49.120 <- I (16839) BT_HID: Scanning for HID devices (3s)...
18:06:49.120 <- E rmt: hw buffer too small, received symbols truncated
18:06:49.622 <- BU.OK flash post_part=roundtrip log_head=11 log_tail=0 partitions_size=4128768
18:06:51.076 -> BU.I2C
18:06:51.589 <- I (19849) BT_HID: Found 0 HID device(s)
18:06:51.589 <- I (19849) BT_HID: No HID devices found, retrying in 2000ms...
18:06:51.589 <- I (20449) I2C: POST: TCA9555 OK (port0=0x0123)
18:06:51.589 <- BU.OK i2c tca9555=ack
18:06:51.590 -> BU.LED 0
18:06:52.091 <- BU.OK led mask=0
18:06:52.344 -> BU.LED 1
18:06:52.845 <- BU.OK led mask=1
18:06:53.098 -> BU.LED 3
18:06:53.098 <- I (21849) BT_HID: Scanning for HID devices (3s)...
18:06:53.098 <- E rmt: hw buffer too small, received symbols truncated
18:06:53.599 <- BU.OK led mask=3
18:06:53.850 -> BU.LED 7
18:06:54.353 <- BU.OK led mask=7
18:06:54.604 -> BU.LED 6
18:06:55.117 <- BU.OK led mask=6
18:06:55.117 -> BU.LED 0
18:06:55.633 <- BU.OK led mask=0
18:06:57.108 -> BU.ADC
18:06:57.108 <- I (24859) BT_HID: Found 0 HID device(s)
18:06:57.108 <- I (24859) BT_HID: No HID devices found, retrying in 2000ms...
18:06:57.613 <- E rmt: hw buffer too small, received symbols truncated
18:06:57.613 <- BU.OK adc bat_mv=1642 bat_V=13.003 isens_mv=1666 isens_A=-1.21 voc_mv=3150 fault=1
18:07:01.579 -> BU.SENSORS.WATCH 0
18:07:01.579 <- I (26859) BT_HID: Scanning for HID devices (3s)...
18:07:01.580 <- E rmt: hw buffer too small, received symbols truncated
18:07:01.580 <- E rmt: hw buffer too small, received symbols truncated
18:07:01.580 <- I (29869) BT_HID: Found 0 HID device(s)
18:07:01.580 <- I (29869) BT_HID: No HID devices found, retrying in 2000ms...
18:07:02.011 <- E rmt: hw buffer too small, received symbols truncated
18:07:02.011 <- BU.EVENT state t=16.53 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:02.011 <- BU.EVENT state t=16.79 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:02.519 <- E rmt: hw buffer too small, received symbols truncated
18:07:02.519 <- BU.EVENT state t=17.04 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:02.519 <- E rmt: hw buffer too small, received symbols truncated
18:07:02.519 <- BU.EVENT state t=17.29 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:03.034 <- I (31869) BT_HID: Scanning for HID devices (3s)...
18:07:03.034 <- BU.EVENT state t=17.54 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:03.034 <- BU.EVENT state t=17.79 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:03.536 <- BU.EVENT state t=18.05 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:03.536 <- BU.EVENT state t=18.30 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:04.038 <- BU.EVENT state t=18.55 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:04.038 <- BU.EVENT state t=18.80 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:04.540 <- BU.EVENT state t=19.05 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:04.540 <- BU.EVENT state t=19.30 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:05.055 <- BU.EVENT state t=19.55 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:05.055 <- BU.EVENT state t=19.80 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:05.537 <- BU.EVENT state t=20.05 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:05.537 <- BU.EVENT state t=20.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:05.537 <- I (34879) BT_HID: Found 0 HID device(s)
18:07:06.038 <- I (34879) BT_HID: No HID devices found, retrying in 2000ms...
18:07:06.038 <- BU.EVENT state t=20.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:06.038 <- BU.EVENT state t=20.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:06.383 <- BU.EVENT state t=21.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:07:06.383 <- BU.EVENT sensor name=SAFETY edge=make t=21.25
18:07:06.384 <- BU.EVENT sensor name=SAFETY edge=break t=21.26
18:07:06.882 <- BU.EVENT state t=21.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=2 isr_d=0 isr_j=0 isr_a=0
18:07:06.882 <- E rmt: hw buffer too small, received symbols truncated
18:07:06.882 <- BU.EVENT sensor name=SAFETY edge=make t=21.46
18:07:06.885 <- BU.EVENT state t=21.56 SAFETY=1 DRIVE=0 JACK=0 AUX=0 isr_s=3 isr_d=0 isr_j=0 isr_a=0
18:07:07.381 <- BU.EVENT state t=21.81 SAFETY=1 DRIVE=0 JACK=0 AUX=0 isr_s=3 isr_d=0 isr_j=0 isr_a=0
18:07:07.381 <- E rmt: hw buffer too small, received symbols truncated
18:07:07.381 <- BU.EVENT state t=22.06 SAFETY=1 DRIVE=0 JACK=0 AUX=0 isr_s=3 isr_d=0 isr_j=0 isr_a=0
18:07:07.381 <- BU.EVENT sensor name=SAFETY edge=break t=22.20
18:07:07.881 <- BU.EVENT state t=22.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:07.882 <- I (36879) BT_HID: Scanning for HID devices (3s)...
18:07:07.882 <- BU.EVENT state t=22.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:07.882 <- E rmt: hw buffer too small, received symbols truncated
18:07:08.383 <- BU.EVENT state t=22.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:08.383 <- BU.EVENT state t=23.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:08.890 <- BU.EVENT state t=23.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:08.890 <- BU.EVENT state t=23.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:08.890 <- BU.EVENT state t=23.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:09.396 <- BU.EVENT state t=24.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:09.396 <- E rmt: hw buffer too small, received symbols truncated
18:07:09.396 <- BU.EVENT state t=24.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:09.896 <- BU.EVENT state t=24.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:09.896 <- BU.EVENT state t=24.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:10.397 <- BU.EVENT state t=25.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:10.397 <- BU.EVENT state t=25.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:10.643 <- I (39889) BT_HID: Found 0 HID device(s)
18:07:10.643 <- I (39889) BT_HID: No HID devices found, retrying in 2000ms...
18:07:10.643 <- E rmt: hw buffer too small, received symbols truncated
18:07:11.151 <- BU.EVENT state t=25.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:11.151 <- E rmt: hw buffer too small, received symbols truncated
18:07:11.151 <- BU.EVENT state t=25.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:11.151 <- BU.EVENT state t=26.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:11.667 <- BU.EVENT state t=26.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:11.667 <- E rmt: hw buffer too small, received symbols truncated
18:07:11.667 <- BU.EVENT state t=26.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:12.182 <- BU.EVENT state t=26.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:12.182 <- BU.EVENT state t=27.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:12.641 <- BU.EVENT state t=27.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:12.641 <- I (41889) BT_HID: Scanning for HID devices (3s)...
18:07:12.641 <- E rmt: hw buffer too small, received symbols truncated
18:07:13.144 <- BU.EVENT state t=27.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:13.144 <- BU.EVENT state t=27.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:13.144 <- E rmt: hw buffer too small, received symbols truncated
18:07:13.654 <- BU.EVENT state t=28.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:13.654 <- BU.EVENT state t=28.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:13.654 <- E rmt: hw buffer too small, received symbols truncated
18:07:13.654 <- BU.EVENT state t=28.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:14.157 <- BU.EVENT state t=28.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:14.157 <- E rmt: hw buffer too small, received symbols truncated
18:07:14.157 <- BU.EVENT state t=29.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:14.662 <- BU.EVENT state t=29.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:14.662 <- E rmt: hw buffer too small, received symbols truncated
18:07:14.662 <- BU.EVENT state t=29.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:15.164 <- E rmt: hw buffer too small, received symbols truncated
18:07:15.164 <- BU.EVENT state t=29.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:15.164 <- BU.EVENT state t=30.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:15.557 <- BU.EVENT state t=30.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:15.557 <- E rmt: hw buffer too small, received symbols truncated
18:07:15.557 <- I (44899) BT_HID: Found 0 HID device(s)
18:07:16.067 <- I (44899) BT_HID: No HID devices found, retrying in 2000ms...
18:07:16.067 <- BU.EVENT state t=30.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:16.067 <- BU.EVENT state t=30.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:16.574 <- BU.EVENT state t=31.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:16.574 <- BU.EVENT state t=31.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:16.574 <- E rmt: hw buffer too small, received symbols truncated
18:07:17.076 <- BU.EVENT state t=31.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:17.076 <- BU.EVENT state t=31.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:17.551 <- BU.EVENT state t=32.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:17.551 <- E rmt: hw buffer too small, received symbols truncated
18:07:17.551 <- BU.EVENT state t=32.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:18.060 <- I (46899) BT_HID: Scanning for HID devices (3s)...
18:07:18.060 <- BU.EVENT state t=32.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:18.060 <- BU.EVENT state t=32.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:18.575 <- BU.EVENT state t=33.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:18.575 <- BU.EVENT state t=33.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:19.090 <- BU.EVENT state t=33.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:19.090 <- BU.EVENT state t=33.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:19.595 <- BU.EVENT state t=34.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:19.595 <- BU.EVENT state t=34.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:20.097 <- BU.EVENT state t=34.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:20.097 <- E rmt: hw buffer too small, received symbols truncated
18:07:20.097 <- BU.EVENT state t=34.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:20.567 <- BU.EVENT state t=35.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:20.567 <- BU.EVENT state t=35.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:20.567 <- I (49909) BT_HID: Found 0 HID device(s)
18:07:20.986 <- I (49909) BT_HID: No HID devices found, retrying in 2000ms...
18:07:20.986 <- BU.EVENT state t=35.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:20.986 <- BU.EVENT state t=35.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:21.143 <- E rmt: hw buffer too small, received symbols truncated
18:07:21.143 <- E rmt: hw buffer too small, received symbols truncated
18:07:21.143 <- E rmt: hw buffer too small, received symbols truncated
18:07:21.143 <- E rmt: hw buffer too small, received symbols truncated
18:07:21.645 <- BU.EVENT state t=36.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:21.645 <- BU.EVENT state t=36.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:21.645 <- E rmt: hw buffer too small, received symbols truncated
18:07:21.645 <- BU.EVENT state t=36.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:22.160 <- BU.EVENT state t=36.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:22.160 <- BU.EVENT state t=37.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:22.641 <- BU.EVENT state t=37.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:22.641 <- E rmt: hw buffer too small, received symbols truncated
18:07:22.641 <- I (51909) BT_HID: Scanning for HID devices (3s)...
18:07:23.143 <- BU.EVENT state t=37.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:23.143 <- BU.EVENT state t=37.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:23.143 <- E rmt: hw buffer too small, received symbols truncated
18:07:23.648 <- BU.EVENT state t=38.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:23.648 <- BU.EVENT state t=38.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=4 isr_d=0 isr_j=0 isr_a=0
18:07:23.648 <- E rmt: hw buffer too small, received symbols truncated

File diff suppressed because it is too large Load Diff

View File

@@ -1,753 +0,0 @@
18:17:18.258 == Flashing COM3 ==
18:17:18.261 flashing from D:\SC\SC-F001\build
18:17:18.262 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]
18:17:43.243 == Flash complete ==
18:17:44.744 Connecting to COM3 @ 115200 ...
18:17:44.749 -> BU.BEGIN
18:17:44.962 <- BU.BEGIN
18:17:44.962 <-
18:17:44.962 <- BU.OK begin fw=a775999-dirty board=V5 t=0.00
18:17:44.963 -> BU.INFO
18:17:44.963 <- E rmt: hw buffer too small, received symbols truncated
18:17:44.963 <- I (1819) BT_HID: Scanning for HID devices (3s)...
18:17:44.963 <- I (1829) BT_HID: BLE HID host initialised
18:17:44.986 <- I (1829) WEBSERVER: Initializing webserver...
18:17:44.986 <- I (1829) WEBSERVER: AP LAUNCHING
18:17:44.986 <- I (1849) wifi:wifi driver task: 3ffe2884, prio:23, stack:6656, core=0
18:17:44.986 <- I (1849) wifi:wifi firmware version: ccaebfa
18:17:44.986 <- I (1849) wifi:wifi certification version: v7.0
18:17:45.008 <- I (1849) wifi:config NVS flash: enabled
18:17:45.008 <- I (1859) wifi:config nano formating: disabled
18:17:45.008 <- BU.OK info reset=POWERON heap=115124 min_heap=114096 fw=a775999-dirty build=2026-04-22 21:25:54
18:17:53.122 -> BU.FLASH
18:17:53.122 <- I (1859) wifi:Init data frame dynamic rx buffer num: 32
18:17:53.123 <- I (1869) wifi:Init static rx mgmt buffer num: 5
18:17:53.123 <- I (1879) wifi:Init management short buffer num: 32
18:17:53.123 <- I (1879) wifi:Init dynamic tx buffer num: 32
18:17:53.123 <- I (1889) wifi:Init static rx buffer size: 1600
18:17:53.123 <- I (1889) wifi:Init static rx buffer num: 10
18:17:53.123 <- I (1889) wifi:Init dynamic rx buffer num: 32
18:17:53.123 <- I (1899) wifi_init: rx ba win: 6
18:17:53.123 <- I (1899) wifi_init: accept mbox: 6
18:17:53.123 <- I (1909) wifi_init: tcpip mbox: 32
18:17:53.123 <- I (1909) wifi_init: udp mbox: 6
18:17:53.123 <- I (1909) wifi_init: tcp mbox: 6
18:17:53.124 <- I (1919) wifi_init: tcp tx win: 5760
18:17:53.124 <- I (1919) wifi_init: tcp rx win: 5760
18:17:53.124 <- I (1929) wifi_init: tcp mss: 1440
18:17:53.124 <- I (1939) wifi:mode : softAP (80:f3:da:65:25:f9)
18:17:53.124 <- I (1949) wifi:Total power save buffer number: 16
18:17:53.124 <- I (1949) wifi:Init max length of beacon: 752/752
18:17:53.124 <- I (1949) wifi:Init max length of beacon: 752/752
18:17:53.124 <- I (1949) esp_netif_lwip: DHCP server started on interface WIFI_AP_DEF with IP: 192.168.4.1
18:17:53.124 <- I (1959) DNS_SERVER: DNS server started on port 53
18:17:53.125 <- I (1969) mdns_mem: mDNS task will be created from internal RAM
18:17:53.125 <- I (1969) WEBSERVER: SoftAP ready. SSID: sc.local, Channel: 6, Password: password
18:17:53.125 <- I (1979) WEBSERVER: Access at: http://sc.local.local or http://192.168.4.1
18:17:53.125 <- I (1979) WEBSERVER: STARTING HTTP
18:17:53.125 <- I (1989) WEBSERVER: HTTP server started successfully
18:17:53.125 <- I (1989) WEBSERVER: Registered URI handler: /
18:17:53.125 <- I (1999) WEBSERVER: Registered URI handler: /get
18:17:53.126 <- I (2009) WEBSERVER: Registered URI handler: /post
18:17:53.126 <- I (2009) WEBSERVER: Registered URI handler: /log
18:17:53.126 <- I (2019) WEBSERVER: Registered URI handler: /ota
18:17:53.126 <- I (2019) WEBSERVER: Registered URI handler: /*
18:17:53.126 <- I (2029) WEBSERVER: Webserver initialization complete
18:17:53.126 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.126 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.126 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.126 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.127 <- I (4839) BT_HID: Found 0 HID device(s)
18:17:53.127 <- I (4839) BT_HID: No HID devices found, retrying in 2000ms...
18:17:53.127 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.127 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.127 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.127 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.127 <- I (6839) BT_HID: Scanning for HID devices (3s)...
18:17:53.127 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.127 <- I (9849) BT_HID: Found 0 HID device(s)
18:17:53.639 <- I (9849) BT_HID: No HID devices found, retrying in 2000ms...
18:17:53.639 <- E rmt: hw buffer too small, received symbols truncated
18:17:53.639 <- BU.OK flash post_part=roundtrip log_head=33 log_tail=0 partitions_size=4128768
18:17:55.202 -> BU.I2C
18:17:55.717 <- I (11849) BT_HID: Scanning for HID devices (3s)...
18:17:55.717 <- I (12099) I2C: POST: TCA9555 OK (port0=0x0123)
18:17:55.717 <- BU.OK i2c tca9555=ack
18:17:55.719 -> BU.LED 0
18:17:56.221 <- BU.OK led mask=0
18:17:56.473 -> BU.LED 1
18:17:56.975 <- BU.OK led mask=1
18:17:57.227 -> BU.LED 3
18:17:57.740 <- BU.OK led mask=3
18:17:57.740 -> BU.LED 0
18:17:58.244 <- BU.OK led mask=0
18:17:59.458 -> BU.ADC
18:17:59.458 <- I (14859) BT_HID: Found 0 HID device(s)
18:17:59.459 <- I (14859) BT_HID: No HID devices found, retrying in 2000ms...
18:17:59.459 <- E rmt: hw buffer too small, received symbols truncated
18:17:59.972 <- E rmt: hw buffer too small, received symbols truncated
18:17:59.972 <- E rmt: hw buffer too small, received symbols truncated
18:17:59.972 <- BU.OK adc bat_mv=1640 bat_V=12.974 isens_mv=1666 isens_A=-1.21 voc_mv=3150 fault=1
18:18:03.690 -> BU.SENSORS.WATCH 0
18:18:03.690 <- E rmt: hw buffer too small, received symbols truncated
18:18:03.690 <- I (16859) BT_HID: Scanning for HID devices (3s)...
18:18:03.690 <- E rmt: hw buffer too small, received symbols truncated
18:18:03.690 <- E rmt: hw buffer too small, received symbols truncated
18:18:03.690 <- E rmt: hw buffer too small, received symbols truncated
18:18:03.974 <- I (19869) BT_HID: Found 0 HID device(s)
18:18:03.974 <- I (19869) BT_HID: No HID devices found, retrying in 2000ms...
18:18:03.974 <- BU.EVENT state t=18.94 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:04.490 <- BU.EVENT state t=19.20 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:04.490 <- E rmt: hw buffer too small, received symbols truncated
18:18:04.490 <- BU.EVENT state t=19.45 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:04.490 <- BU.EVENT state t=19.70 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:05.004 <- BU.EVENT state t=19.95 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:05.004 <- BU.EVENT state t=20.20 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:05.004 <- I (21869) BT_HID: Scanning for HID devices (3s)...
18:18:05.504 <- E rmt: hw buffer too small, received symbols truncated
18:18:05.504 <- BU.EVENT state t=20.45 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:05.504 <- BU.EVENT state t=20.70 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:06.005 <- BU.EVENT state t=20.95 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:06.005 <- BU.EVENT state t=21.20 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:06.511 <- BU.EVENT state t=21.45 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:06.511 <- BU.EVENT state t=21.70 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:07.026 <- BU.EVENT state t=21.95 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:07.026 <- BU.EVENT state t=22.20 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:07.541 <- BU.EVENT state t=22.46 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:07.541 <- BU.EVENT state t=22.71 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:08.008 <- BU.EVENT state t=22.96 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:08.008 <- BU.EVENT state t=23.21 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:08.008 <- I (24879) BT_HID: Found 0 HID device(s)
18:18:08.517 <- I (24879) BT_HID: No HID devices found, retrying in 2000ms...
18:18:08.517 <- BU.EVENT state t=23.47 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:08.517 <- BU.EVENT state t=23.72 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:09.032 <- BU.EVENT state t=23.98 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:09.032 <- BU.EVENT state t=24.23 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:09.536 <- E rmt: hw buffer too small, received symbols truncated
18:18:09.536 <- BU.EVENT state t=24.48 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:09.536 <- BU.EVENT state t=24.73 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:10.038 <- BU.EVENT state t=24.98 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:10.038 <- I (26879) BT_HID: Scanning for HID devices (3s)...
18:18:10.038 <- BU.EVENT state t=25.23 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:10.542 <- BU.EVENT state t=25.48 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:10.542 <- BU.EVENT state t=25.74 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:11.048 <- BU.EVENT state t=25.99 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:11.048 <- BU.EVENT state t=26.24 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:11.048 <- E rmt: hw buffer too small, received symbols truncated
18:18:11.555 <- BU.EVENT state t=26.49 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:11.555 <- E rmt: hw buffer too small, received symbols truncated
18:18:11.555 <- BU.EVENT state t=26.74 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:12.057 <- BU.EVENT state t=26.99 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:12.057 <- BU.EVENT state t=27.24 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:12.562 <- BU.EVENT state t=27.49 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:12.562 <- BU.EVENT state t=27.74 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:13.022 <- BU.EVENT state t=27.99 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:13.022 <- BU.EVENT state t=28.24 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:13.022 <- I (29889) BT_HID: Found 0 HID device(s)
18:18:13.529 <- I (29889) BT_HID: No HID devices found, retrying in 2000ms...
18:18:13.529 <- BU.EVENT state t=28.50 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:13.529 <- BU.EVENT state t=28.75 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:14.030 <- BU.EVENT state t=29.00 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:14.030 <- BU.EVENT state t=29.25 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:14.531 <- BU.EVENT state t=29.50 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:14.531 <- BU.EVENT state t=29.75 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:15.033 <- BU.EVENT state t=30.00 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:15.033 <- I (31889) BT_HID: Scanning for HID devices (3s)...
18:18:15.549 <- BU.EVENT state t=30.26 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:15.549 <- BU.EVENT state t=30.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:15.549 <- E rmt: hw buffer too small, received symbols truncated
18:18:15.549 <- BU.EVENT state t=30.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:16.065 <- BU.EVENT state t=31.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:16.065 <- BU.EVENT state t=31.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:16.577 <- BU.EVENT state t=31.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:16.577 <- BU.EVENT state t=31.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:17.041 <- BU.EVENT state t=32.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:17.042 <- E rmt: hw buffer too small, received symbols truncated
18:18:17.042 <- E rmt: hw buffer too small, received symbols truncated
18:18:17.544 <- BU.EVENT state t=32.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:17.544 <- BU.EVENT state t=32.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:17.545 <- E rmt: hw buffer too small, received symbols truncated
18:18:17.545 <- BU.EVENT state t=32.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:18.042 <- BU.EVENT state t=33.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:18.042 <- I (34899) BT_HID: Found 0 HID device(s)
18:18:18.042 <- I (34899) BT_HID: No HID devices found, retrying in 2000ms...
18:18:18.543 <- BU.EVENT state t=33.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:18.543 <- BU.EVENT state t=33.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:19.046 <- BU.EVENT state t=33.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:19.046 <- BU.EVENT state t=34.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:19.046 <- BU.EVENT state t=34.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:19.547 <- BU.EVENT state t=34.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:19.547 <- BU.EVENT state t=34.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:20.053 <- BU.EVENT state t=35.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:20.053 <- I (36899) BT_HID: Scanning for HID devices (3s)...
18:18:20.053 <- BU.EVENT state t=35.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:20.569 <- BU.EVENT state t=35.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:20.569 <- BU.EVENT state t=35.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:21.073 <- BU.EVENT state t=36.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:21.073 <- BU.EVENT state t=36.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:21.575 <- BU.EVENT state t=36.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:21.575 <- BU.EVENT state t=36.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:22.089 <- BU.EVENT state t=37.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:22.089 <- E rmt: hw buffer too small, received symbols truncated
18:18:22.089 <- BU.EVENT state t=37.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:22.591 <- BU.EVENT state t=37.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:22.591 <- BU.EVENT state t=37.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:23.043 <- BU.EVENT state t=38.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:23.043 <- I (39909) BT_HID: Found 0 HID device(s)
18:18:23.043 <- I (39909) BT_HID: No HID devices found, retrying in 2000ms...
18:18:23.549 <- BU.EVENT state t=38.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:23.549 <- BU.EVENT state t=38.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:23.549 <- BU.EVENT state t=38.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:24.050 <- BU.EVENT state t=39.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:24.050 <- BU.EVENT state t=39.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:24.563 <- BU.EVENT state t=39.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:24.563 <- BU.EVENT state t=39.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:25.064 <- BU.EVENT state t=40.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:25.064 <- I (41909) BT_HID: Scanning for HID devices (3s)...
18:18:25.064 <- BU.EVENT state t=40.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:25.576 <- BU.EVENT state t=40.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:25.576 <- BU.EVENT state t=40.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:26.076 <- BU.EVENT state t=41.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:26.076 <- BU.EVENT state t=41.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:26.577 <- BU.EVENT state t=41.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:26.577 <- BU.EVENT state t=41.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:27.079 <- BU.EVENT state t=42.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:27.085 <- BU.EVENT state t=42.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:27.594 <- BU.EVENT state t=42.52 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:27.594 <- BU.EVENT state t=42.77 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:28.052 <- BU.EVENT state t=43.02 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:28.052 <- BU.EVENT state t=43.27 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:28.052 <- I (44919) BT_HID: Found 0 HID device(s)
18:18:28.553 <- I (44919) BT_HID: No HID devices found, retrying in 2000ms...
18:18:28.553 <- BU.EVENT state t=43.53 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:28.553 <- E rmt: hw buffer too small, received symbols truncated
18:18:29.063 <- BU.EVENT state t=43.78 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:29.063 <- BU.EVENT state t=44.03 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:29.063 <- BU.EVENT state t=44.28 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:29.579 <- BU.EVENT state t=44.53 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:29.579 <- BU.EVENT state t=44.78 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:30.083 <- BU.EVENT state t=45.03 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:30.083 <- I (46919) BT_HID: Scanning for HID devices (3s)...
18:18:30.083 <- BU.EVENT state t=45.28 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:30.585 <- BU.EVENT state t=45.53 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:30.585 <- BU.EVENT state t=45.78 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:30.585 <- E rmt: hw buffer too small, received symbols truncated
18:18:31.089 <- BU.EVENT state t=46.03 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:31.089 <- BU.EVENT state t=46.28 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:31.591 <- BU.EVENT state t=46.53 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:31.591 <- BU.EVENT state t=46.78 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:31.591 <- E rmt: hw buffer too small, received symbols truncated
18:18:32.051 <- E rmt: hw buffer too small, received symbols truncated
18:18:32.051 <- BU.EVENT state t=47.03 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:32.051 <- E rmt: hw buffer too small, received symbols truncated
18:18:32.559 <- BU.EVENT state t=47.28 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:32.559 <- BU.EVENT state t=47.53 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:32.559 <- BU.EVENT state t=47.78 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:33.061 <- BU.EVENT state t=48.03 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:33.061 <- BU.EVENT state t=48.28 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:33.562 <- I (49929) BT_HID: Found 0 HID device(s)
18:18:33.562 <- I (49929) BT_HID: No HID devices found, retrying in 2000ms...
18:18:33.562 <- E rmt: hw buffer too small, received symbols truncated
18:18:33.562 <- BU.EVENT state t=48.54 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:34.075 <- BU.EVENT state t=48.79 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:34.075 <- BU.EVENT state t=49.04 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:34.075 <- BU.EVENT state t=49.29 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:34.577 <- BU.EVENT state t=49.54 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:34.577 <- BU.EVENT state t=49.79 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:35.088 <- BU.EVENT state t=50.04 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:35.088 <- I (51929) BT_HID: Scanning for HID devices (3s)...
18:18:35.088 <- BU.EVENT state t=50.29 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:35.591 <- BU.EVENT state t=50.54 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:35.591 <- BU.EVENT state t=50.79 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:36.095 <- E rmt: hw buffer too small, received symbols truncated
18:18:36.095 <- BU.EVENT state t=51.04 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:36.095 <- BU.EVENT state t=51.29 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:36.608 <- BU.EVENT state t=51.54 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:36.608 <- BU.EVENT state t=51.79 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:37.109 <- BU.EVENT state t=52.04 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:37.109 <- BU.EVENT state t=52.29 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:37.614 <- E rmt: hw buffer too small, received symbols truncated
18:18:37.614 <- BU.EVENT state t=52.54 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:37.614 <- BU.EVENT state t=52.80 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:38.073 <- BU.EVENT state t=53.05 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:38.073 <- I (54939) BT_HID: Found 0 HID device(s)
18:18:38.073 <- I (54939) BT_HID: No HID devices found, retrying in 2000ms...
18:18:38.584 <- BU.EVENT state t=53.30 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:38.584 <- E rmt: hw buffer too small, received symbols truncated
18:18:38.584 <- BU.EVENT state t=53.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:39.085 <- BU.EVENT state t=53.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:39.085 <- BU.EVENT state t=54.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:39.085 <- BU.EVENT state t=54.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:39.598 <- BU.EVENT state t=54.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:39.598 <- BU.EVENT state t=54.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:40.112 <- BU.EVENT state t=55.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:40.112 <- I (56939) BT_HID: Scanning for HID devices (3s)...
18:18:40.112 <- BU.EVENT state t=55.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:40.626 <- BU.EVENT state t=55.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:40.626 <- BU.EVENT state t=55.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:41.139 <- BU.EVENT state t=56.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:41.139 <- BU.EVENT state t=56.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:41.655 <- BU.EVENT state t=56.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:41.655 <- BU.EVENT state t=56.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:42.169 <- BU.EVENT state t=57.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:42.169 <- BU.EVENT state t=57.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:42.670 <- BU.EVENT state t=57.56 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:42.670 <- BU.EVENT state t=57.81 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:43.083 <- BU.EVENT state t=58.06 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:43.083 <- I (59949) BT_HID: Found 0 HID device(s)
18:18:43.083 <- I (59949) BT_HID: No HID devices found, retrying in 2000ms...
18:18:43.593 <- BU.EVENT state t=58.31 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:43.593 <- BU.EVENT state t=58.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:44.096 <- BU.EVENT state t=58.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:44.096 <- BU.EVENT state t=59.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:44.096 <- BU.EVENT state t=59.32 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:44.601 <- BU.EVENT state t=59.57 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:44.601 <- BU.EVENT state t=59.82 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:45.106 <- BU.EVENT state t=60.07 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:45.106 <- I (61949) BT_HID: Scanning for HID devices (3s)...
18:18:45.106 <- BU.EVENT state t=60.33 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:45.620 <- BU.EVENT state t=60.58 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:45.620 <- BU.EVENT state t=60.83 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:46.122 <- BU.EVENT state t=61.08 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:46.122 <- BU.EVENT state t=61.33 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:46.637 <- BU.EVENT state t=61.58 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:46.637 <- BU.EVENT state t=61.83 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:47.139 <- BU.EVENT state t=62.08 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:47.139 <- E rmt: hw buffer too small, received symbols truncated
18:18:47.139 <- BU.EVENT state t=62.33 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:47.641 <- BU.EVENT state t=62.58 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:47.641 <- BU.EVENT state t=62.83 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:48.111 <- BU.EVENT state t=63.08 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:48.111 <- I (64959) BT_HID: Found 0 HID device(s)
18:18:48.111 <- I (64959) BT_HID: No HID devices found, retrying in 2000ms...
18:18:48.622 <- BU.EVENT state t=63.34 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:48.622 <- BU.EVENT state t=63.59 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:49.137 <- BU.EVENT state t=63.85 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:49.137 <- E rmt: hw buffer too small, received symbols truncated
18:18:49.137 <- BU.EVENT state t=64.10 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:49.137 <- BU.EVENT state t=64.35 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:49.651 <- E rmt: hw buffer too small, received symbols truncated
18:18:49.651 <- BU.EVENT state t=64.60 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:49.651 <- BU.EVENT state t=64.85 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:50.163 <- BU.EVENT state t=65.10 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:50.163 <- I (66959) BT_HID: Scanning for HID devices (3s)...
18:18:50.163 <- BU.EVENT state t=65.35 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:50.677 <- BU.EVENT state t=65.60 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:50.677 <- BU.EVENT state t=65.86 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:51.188 <- BU.EVENT state t=66.11 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:51.188 <- BU.EVENT state t=66.36 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:51.693 <- BU.EVENT state t=66.61 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:51.693 <- BU.EVENT state t=66.86 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:52.194 <- BU.EVENT state t=67.11 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:52.194 <- E rmt: hw buffer too small, received symbols truncated
18:18:52.194 <- BU.EVENT state t=67.36 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:52.697 <- BU.EVENT state t=67.61 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:52.697 <- BU.EVENT state t=67.86 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:53.097 <- E rmt: hw buffer too small, received symbols truncated
18:18:53.097 <- BU.EVENT state t=68.11 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:53.097 <- I (69969) BT_HID: Found 0 HID device(s)
18:18:53.607 <- I (69969) BT_HID: No HID devices found, retrying in 2000ms...
18:18:53.607 <- BU.EVENT state t=68.36 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:53.607 <- E rmt: hw buffer too small, received symbols truncated
18:18:53.607 <- BU.EVENT state t=68.61 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:53.900 <- BU.EVENT state t=68.86 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:53.900 <- E rmt: hw buffer too small, received symbols truncated
18:18:53.900 <- BU.EVENT state t=69.11 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:54.405 <- E rmt: hw buffer too small, received symbols truncated
18:18:54.405 <- BU.EVENT state t=69.36 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:54.405 <- BU.EVENT state t=69.61 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:54.920 <- BU.EVENT state t=69.86 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:54.920 <- BU.EVENT state t=70.11 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=0 isr_a=0
18:18:55.422 <- I (71969) BT_HID: Scanning for HID devices (3s)...
18:18:55.422 <- BU.EVENT state t=70.36 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:55.422 <- BU.EVENT state t=70.61 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:55.923 <- BU.EVENT state t=70.86 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:55.923 <- BU.EVENT state t=71.11 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:56.438 <- E rmt: hw buffer too small, received symbols truncated
18:18:56.438 <- BU.EVENT state t=71.36 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:56.438 <- BU.EVENT state t=71.61 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:56.940 <- BU.EVENT state t=71.86 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:56.940 <- BU.EVENT state t=72.11 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:57.456 <- BU.EVENT state t=72.36 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:57.456 <- BU.EVENT state t=72.61 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:57.970 <- E rmt: hw buffer too small, received symbols truncated
18:18:57.970 <- BU.EVENT state t=72.87 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:57.970 <- BU.EVENT state t=73.12 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:58.392 <- I (74979) BT_HID: Found 0 HID device(s)
18:18:58.392 <- I (74979) BT_HID: No HID devices found, retrying in 2000ms...
18:18:58.392 <- BU.EVENT state t=73.37 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:58.907 <- BU.EVENT state t=73.62 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:58.907 <- BU.EVENT state t=73.87 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:58.907 <- BU.EVENT state t=74.12 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:59.421 <- BU.EVENT state t=74.37 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:59.421 <- BU.EVENT state t=74.62 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0
18:18:59.936 <- BU.EVENT state t=74.87 SAFETY=0 DRIVE=0 JACK=0 AUX=0 isr_s=0 isr_d=0 isr_j=1 isr_a=0

View File

@@ -1,3 +0,0 @@
18:24:39.175 == Flashing COM3 ==
18:24:39.177 flashing from D:\SC\SC-F001\build
18:24:39.177 files: [('0x1000', 'bootloader/bootloader.bin'), ('0x10000', 'SC-F001.bin'), ('0x8000', 'partition_table/partition-table.bin'), ('0xd000', 'ota_data_initial.bin')]

Binary file not shown.

View File

@@ -271,6 +271,18 @@ Single physical button (button 0 via TCA9555 I2C expander) controls all interact
### LED Status Indicators
**Physical LED layout** — the three LEDs are wired to TCA9555 port-0 pins
P05, P06, P07. Read bottom → top when checking error codes:
| TCA pin | Bit | Physical position | Called |
|---------|-----|-------------------|--------|
| P05 | 0 | bottom | LED1 |
| P06 | 1 | middle | LED2 |
| P07 | 2 | top | LED3 |
A pattern written as `001` (LSB first) means **only the bottom LED is lit**,
`100` means **only the top LED is lit**, and `111` means all three.
| State | Pattern | Timing |
|-------|---------|--------|
| Idle | LED1 blink | 0.5Hz (1s on / 1s off) |
@@ -282,12 +294,12 @@ Single physical button (button 0 via TCA9555 I2C expander) controls all interact
**Error code bits (during 2s hold phase):**
| LED Pattern | Meaning |
|-------------|---------|
| 001 (LED1) | Efuse tripped (any bridge) or low battery |
| 010 (LED2) | RTC/clock not set |
| 100 (LED3) | Safety sensor break or leash limit hit |
| 111 (all) | Unknown FSM error (fallback) |
| LED Pattern (bottom→top) | Meaning |
|--------------------------|---------|
| 001 — only bottom (P05) lit | Efuse tripped (any bridge) or low battery |
| 010 — only middle (P06) lit | RTC/clock not set |
| 100 — only top (P07) lit | Safety sensor break or leash limit hit |
| 111 all three lit | Unknown FSM error (fallback) |
Error codes are also shown on the web interface status field with individual flag names.

View File

@@ -37,6 +37,7 @@ from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
import fmt # noqa: E402
from protocol import Link # noqa: E402
from stages import all_stages, Tally # noqa: E402
import flash as flasher # noqa: E402
@@ -91,7 +92,7 @@ def main() -> int:
transcript_file = transcript_path.open("w", encoding="utf-8")
def _tx(line: str) -> None:
ts = datetime.now().strftime("%H:%M:%S.%f")[:-3]
transcript_file.write(f"{ts} {line}\n")
transcript_file.write(f"{ts} {fmt.strip(line)}\n")
transcript_file.flush()
transcript_cb = _tx
print(f"Transcript → {transcript_path}")
@@ -103,9 +104,9 @@ def main() -> int:
# Phase 1: optional flash
if args.flash or args.flash_only:
_log(f"== Flashing {args.port} ==")
_log(fmt.stage(f"Flashing {args.port}"))
_do_flash(args, _log)
_log("== Flash complete ==")
_log(fmt.pass_("Flash complete"))
if args.flash_only:
if transcript_file:
transcript_file.close()
@@ -141,21 +142,24 @@ def main() -> int:
print(f" EXCEPTION in stage: {e!r}")
tally.note_fail()
if tally.failed > snap[1]:
ans = input(" Stage had FAILs — retry? [y/n]: ").strip().lower()
ans = input(fmt.prompt(" Stage had FAILs — retry? [y/n]") + ": ").strip().lower()
if ans.startswith("y"):
_restore(tally, snap)
continue
break
except KeyboardInterrupt:
print("\nAborted by operator")
print(fmt.warn("\nAborted by operator"))
try:
link.send("BU.END")
except Exception:
pass
print("\n==== Bring-up summary ====")
print(f" pass={tally.passed} fail={tally.failed} "
f"warn={tally.warnings} skip={tally.skipped}")
print(fmt.stage("Bring-up summary"))
print(fmt.summary_line(tally.passed, tally.failed, tally.warnings, tally.skipped))
if tally.failed == 0:
print(f" {fmt.pass_('ALL PASS')}")
else:
print(f" {fmt.fail('FAILURES PRESENT — review above')}")
link.close()
if transcript_file:

129
bringup/fmt.py Normal file
View File

@@ -0,0 +1,129 @@
"""Terminal formatting helpers for the bring-up tool.
Thin wrapper around ANSI escapes so stages.py / bringup.py can emit
consistently-styled headings, prompts, status tags, and result
summaries without sprinkling raw escape codes everywhere.
Colors auto-disable when stdout is not a TTY or when the `NO_COLOR`
environment variable is set (see no-color.org).
"""
from __future__ import annotations
import os
import sys
def _color_supported() -> bool:
if os.environ.get("NO_COLOR") is not None:
return False
if not sys.stdout.isatty():
return False
# Modern Windows 10+ terminals support VT100 once any ANSI sequence has
# been emitted — a no-op system("") call flips the flag on cmd.exe.
if os.name == "nt":
try:
os.system("")
except Exception:
pass
return True
_USE = _color_supported()
def _c(code: str) -> str:
return f"\x1b[{code}m" if _USE else ""
RESET = _c("0")
BOLD = _c("1")
DIM = _c("2")
RED = _c("31")
GREEN = _c("32")
YELLOW = _c("33")
BLUE = _c("34")
MAGENTA = _c("35")
CYAN = _c("36")
def stage(title: str) -> str:
"""Big block heading that opens a stage."""
bar = "-" * 60
return (
f"\n{CYAN}{bar}{RESET}\n"
f"{BOLD}{CYAN} {title}{RESET}\n"
f"{CYAN}{bar}{RESET}"
)
def section(title: str) -> str:
"""Smaller sub-heading inside a stage."""
return f"\n{BOLD}{MAGENTA}-- {title} --{RESET}"
def prompt(text: str) -> str:
return f"{YELLOW}{text}{RESET}"
def tag(label: str, color: str) -> str:
return f"[{color}{BOLD}{label}{RESET}]"
OK_TAG = tag("OK", GREEN)
ERR_TAG = tag("ERR", RED)
SKIP_TAG = tag("SKIP", YELLOW)
WARN_TAG = tag("WARN", YELLOW)
INFO_TAG = tag("INFO", BLUE)
EVT_TAG = tag("EVT", CYAN)
def status_tag(status: str) -> str:
s = (status or "").upper()
return {
"OK": OK_TAG,
"ERR": ERR_TAG,
"SKIP": SKIP_TAG,
"WARN": WARN_TAG,
}.get(s, tag(s or "?", DIM))
def fail(text: str) -> str:
return f"{RED}{BOLD}{text}{RESET}"
def pass_(text: str) -> str:
return f"{GREEN}{BOLD}{text}{RESET}"
def warn(text: str) -> str:
return f"{YELLOW}{text}{RESET}"
def dim(text: str) -> str:
return f"{DIM}{text}{RESET}"
_ANSI_RE = None
def strip(text: str) -> str:
"""Return `text` with all ANSI escape sequences removed.
Used by the transcript writer so log files don't contain `\x1b[...m`
garbage when stdout is colored.
"""
global _ANSI_RE
if _ANSI_RE is None:
import re
_ANSI_RE = re.compile(r"\x1b\[[0-9;]*m")
return _ANSI_RE.sub("", text)
def summary_line(passed: int, failed: int, warnings: int, skipped: int) -> str:
color = GREEN if failed == 0 else RED
return (f" {color}{BOLD}pass={passed}{RESET} "
f"{RED if failed else DIM}{BOLD}fail={failed}{RESET} "
f"{YELLOW if warnings else DIM}warn={warnings}{RESET} "
f"{DIM}skip={skipped}{RESET}")

View File

@@ -6,6 +6,7 @@ from __future__ import annotations
from dataclasses import dataclass
from typing import Callable
import fmt
from protocol import Link, Response, Event
@@ -24,8 +25,8 @@ class Tally:
def _prompt(msg: str, accept_skip: bool = True) -> str:
"""Block for operator input. Returns 'run', 'skip', or 'quit'."""
hint = " [Enter=run" + (", s=skip" if accept_skip else "") + ", q=quit]"
ans = input(msg + hint + ": ").strip().lower()
hint = fmt.dim(" [Enter=run" + (", s=skip" if accept_skip else "") + ", q=quit]")
ans = input(fmt.prompt(msg) + hint + ": ").strip().lower()
if ans in ("", "y", "yes", "r", "run"):
return "run"
if ans in ("s", "skip") and accept_skip:
@@ -38,7 +39,7 @@ def _prompt(msg: str, accept_skip: bool = True) -> str:
def _show_response(label: str, r: Response) -> None:
bag = " ".join(f"{k}={v}" for k, v in r.fields.items())
print(f" [{r.status}] {label} {bag}")
print(f" {fmt.status_tag(r.status)} {label} {fmt.dim(bag)}")
# ---------------------------------------------------------------------------
@@ -46,7 +47,7 @@ def _show_response(label: str, r: Response) -> None:
# ---------------------------------------------------------------------------
def stage_begin(link: Link, t: Tally) -> None:
print("\n== Stage 0 — Begin ==")
print(fmt.stage("Stage 0 — Begin"))
print(" Waiting for device to finish booting ...")
r = link.wait_ready("BU.BEGIN", per_attempt_s=1.5, overall_timeout_s=30.0)
_show_response("begin", r)
@@ -64,7 +65,7 @@ def stage_begin(link: Link, t: Tally) -> None:
# ---------------------------------------------------------------------------
def stage_flash(link: Link, t: Tally) -> None:
print("\n== Stage 1 — Flash & storage ==")
print(fmt.stage("Stage 1 — Flash & storage"))
if _prompt(" Run flash roundtrip + log head/tail check") != "run":
t.note_skip(); return
r = link.request("BU.FLASH", overall_timeout_s=10)
@@ -78,10 +79,9 @@ def stage_flash(link: Link, t: Tally) -> None:
def stage_i2c_led(link: Link, t: Tally) -> None:
import threading
import time
print("\n== Stage 2 — I2C / TCA9555 / LEDs ==")
if _prompt(" Probe TCA9555 and run LED waterfall") != "run":
print(fmt.stage("Stage 2 — I2C / TCA9555 / LEDs"))
if _prompt(" Probe TCA9555 and run LED check") != "run":
t.note_skip(); return
r = link.request("BU.I2C")
@@ -90,51 +90,40 @@ def stage_i2c_led(link: Link, t: Tally) -> None:
t.note_fail(); return
t.note_pass()
# Waterfall: 000 → 001 → 011 → 111 → 110 → 100 → 000, looped.
pattern = [0b000, 0b001, 0b011, 0b111, 0b110, 0b100]
step_s = 0.25
stop = threading.Event()
def driver() -> None:
i = 0
while not stop.is_set():
# Firmware-driven LED watch: all LEDs solid when the button is released,
# fast waterfall while held. Operator actuates the button and confirms.
def reader() -> None:
try:
link.request(f"BU.LED {pattern[i % len(pattern)]}",
overall_timeout_s=2.0)
except Exception as e:
print(f" [led] {e!r}")
break
i += 1
# Sleep in small chunks so we can stop promptly.
for _ in range(int(step_s * 20)):
if stop.is_set():
for item in link.request_stream("BU.LED.WATCH",
overall_timeout_s=3600):
if isinstance(item, Event) and item.cmd == "led":
state = "PRESSED" if item.fields.get("pressed") == "1" else "released"
print(f" [led] button {state}")
elif isinstance(item, Response):
return
time.sleep(0.05)
except Exception as e: # pragma: no cover — defensive
print(f" [led-reader] {e!r}")
th = threading.Thread(target=driver, daemon=True)
th = threading.Thread(target=reader, daemon=True)
th.start()
print(" LED waterfall running — watch the board.")
print(" LEDs should be SOLID (all on) when button is released.")
print(" Press-and-hold the button: LEDs should WATERFALL at ~3× speed.")
try:
while True:
ans = input(" Did the waterfall look correct? [y/n]: ").strip().lower()
ans = input(" LEDs behaved correctly? [y/n]: ").strip().lower()
if ans.startswith("y"):
verdict = "pass"; break
if ans.startswith("n"):
verdict = "fail"; break
finally:
stop.set()
link.send("") # any byte aborts BU.LED.WATCH
th.join(timeout=3)
try:
link.request("BU.LED 0", overall_timeout_s=2.0)
except Exception:
pass
if verdict == "pass":
t.note_pass()
else:
print(" LED visual check FAILED")
print(f" {fmt.fail('LED visual check FAILED')}")
t.note_fail()
@@ -143,8 +132,8 @@ def stage_i2c_led(link: Link, t: Tally) -> None:
# ---------------------------------------------------------------------------
def stage_adc(link: Link, t: Tally, calibrate: bool = True) -> None:
print("\n== Stage 3 — Analog front-end ==")
if _prompt(" Read ADC snapshot (battery / current / FAULT / VOC)") != "run":
print(fmt.stage("Stage 3 — Analog front-end"))
if _prompt(" Read ADC snapshot (battery / motor current)") != "run":
t.note_skip(); return
r = link.request("BU.ADC")
@@ -156,24 +145,9 @@ def stage_adc(link: Link, t: Tally, calibrate: bool = True) -> None:
bat_V = r.getf("bat_V", 0.0)
print(f" -> battery reports {bat_V:.3f} V")
# V5-specific checks — INFORMATIONAL only on the current V5 boards,
# because both VOC and FAULT are wired straight to the ESP32 with no
# external resistors. Without a pull-down on VOC the pin floats at VDD
# (IC has a ~10 µA internal current source toward VDD, needs an
# external RL_VOC to GND to set the OC threshold). Without a pull-up
# on FAULT (open-drain, active-low) the line is undefined. Neither
# reading is actionable in firmware until the board is respun —
# GPIO36/39 are input-only on ESP32 and don't have internal pulls.
# See docs/SC-F001/README.md "V5 hardware caveats".
if "voc_mv" in r.fields:
voc_mv = r.geti("voc_mv")
in_range = 330 <= voc_mv <= 660
print(f" INFO: VOC={voc_mv} mV "
f"({'in' if in_range else 'out of'} datasheet linear range 330660 mV)")
if "fault" in r.fields:
if r.geti("fault") == 1:
print(" INFO: FAULT pin reads LOW — expected on V5 boards without "
"an external pull-up on the FAULT trace")
# VOC and FAULT pins on V5 are unusable (wired direct to input-only
# ESP32 GPIOs, no external resistors — see README "V5 hardware caveats").
# They're intentionally ignored here.
if not calibrate:
return
@@ -183,7 +157,7 @@ def stage_adc(link: Link, t: Tally, calibrate: bool = True) -> None:
def _run_battery_cal(link: Link, t: Tally) -> None:
from calibrate import single_point_offset, verify
print("\n-- Battery voltage calibration --")
print(fmt.section("Battery voltage calibration"))
while True:
ans = input(" Run calibration now? [y/n]: ").strip().lower()
if ans.startswith("n"):
@@ -249,7 +223,7 @@ def stage_sensors(link: Link, t: Tally) -> None:
"""
import threading
print("\n== Stage 4 — Sensor live view ==")
print(fmt.stage("Stage 4 — Sensor live view"))
print(" Live state of all 4 sensor pins is printed below when any one")
print(" changes. Per-edge events also print as they arrive.")
print(" Poke each sensor by hand / magnet / jumper to verify it responds.")
@@ -303,11 +277,11 @@ def stage_sensors(link: Link, t: Tally) -> None:
th.join(timeout=3)
if state["make"] and state["break"]:
print(" SAFETY: PASS (saw break and make)")
print(f" SAFETY: {fmt.pass_('PASS')} (saw break and make)")
t.note_pass()
else:
missing = [k for k, v in state.items() if not v]
print(f" SAFETY: FAIL — missed {missing}")
print(f" SAFETY: {fmt.fail('FAIL')} — missed {missing}")
t.note_fail()
@@ -329,7 +303,7 @@ RELAY_TESTS = [
def stage_relays(link: Link, t: Tally) -> None:
print("\n== Stage 5 — Relay bridges ==")
print(fmt.stage("Stage 5 — Relay bridges"))
print(" PRECONDITIONS:")
print(" - Battery connected, fuse in place")
print(" - Drive wheels off ground / disengaged")
@@ -361,14 +335,14 @@ def stage_relays(link: Link, t: Tally) -> None:
f"tripped={tripped}{edge_str}")
if tripped:
print(" FAIL: efuse tripped"); t.note_fail(); continue
print(f" {fmt.fail('FAIL')}: efuse tripped"); t.note_fail(); continue
if check_edges and edges <= 0:
print(f" FAIL: {bridge} sensor saw no edges — motor not turning?")
print(f" {fmt.fail('FAIL')}: {bridge} sensor saw no edges — motor not turning?")
t.note_fail(); continue
if lo <= delta <= hi:
t.note_pass()
else:
print(f" WARN: ΔI outside nominal")
print(f" {fmt.warn('WARN')}: ΔI outside nominal")
t.note_warn()
@@ -379,7 +353,7 @@ def stage_relays(link: Link, t: Tally) -> None:
def stage_rf(link: Link, t: Tally) -> None:
import threading
print("\n== Stage 6a — RF 433 MHz ==")
print(fmt.stage("Stage 6a — RF 433 MHz"))
if _prompt(" Watch for RF remote codes") != "run":
t.note_skip(); return
@@ -413,7 +387,7 @@ def stage_rf(link: Link, t: Tally) -> None:
def stage_wifi(link: Link, t: Tally) -> None:
print("\n== Stage 6b — WiFi + web UI ==")
print(fmt.stage("Stage 6b — WiFi + web UI"))
if _prompt(" Start SoftAP and wait for a client to load the web UI") != "run":
t.note_skip(); return
r = link.request("BU.WIFI.START", overall_timeout_s=20)
@@ -440,7 +414,7 @@ def stage_wifi(link: Link, t: Tally) -> None:
# ---------------------------------------------------------------------------
def stage_end(link: Link, t: Tally) -> None:
print("\n== Stage — End ==")
print(fmt.stage("Stage — End"))
if _prompt(" Exit bring-up mode (device will reboot)") != "run":
print(" Leaving device in bring-up mode — reset manually to resume normal firmware.")
return

View File

@@ -33,6 +33,7 @@ _FALLBACK_FSM_STATES = {
10: "CALIBRATE_JACK_MOVE",
11: "CALIBRATE_DRIVE_DELAY",
12: "CALIBRATE_DRIVE_MOVE",
13: "DRIVE_FLUFF_START",
}
ESP_RESET_REASONS = {
@@ -193,7 +194,7 @@ def _unpack_time_set(payload: bytes) -> dict:
def _is_valid_entry_type(t: int) -> bool:
return (0 <= t <= 12) or t in (LOG_TYPE_BAT, LOG_TYPE_CRASH, LOG_TYPE_BOOT, LOG_TYPE_TIME_SET)
return (0 <= t <= 13) or t in (LOG_TYPE_BAT, LOG_TYPE_CRASH, LOG_TYPE_BOOT, LOG_TYPE_TIME_SET)
def parse_entries(data: bytes, fsm_states: dict = None, type_first: bool = False) -> list:
@@ -282,7 +283,7 @@ def parse_entries(data: bytes, fsm_states: dict = None, type_first: bool = False
i = end_offset + 1
try:
if 0 <= entry_type <= 12:
if 0 <= entry_type <= 13:
e = _unpack_fsm(payload, fsm_states)
e['entry_type'] = entry_type
e['state_name'] = fsm_states.get(entry_type, f"STATE_{entry_type}")

View File

@@ -1,6 +1,7 @@
# See the build system documentation in IDF programming guide
# for more information about component CMakeLists.txt files.
# Seed version.h at configure time so it exists for the first build.
include(${CMAKE_CURRENT_LIST_DIR}/version.cmake)
idf_component_register(
@@ -27,4 +28,18 @@ if(NOT CMAKE_BUILD_EARLY_EXPANSION)
add_custom_target(generate_webpage_h DEPENDS ${COMPONENT_DIR}/webpage.h)
add_dependencies(${COMPONENT_LIB} generate_webpage_h)
# Regenerate version.h on every build so git SHA / dirty flag stay
# current as commits land between builds. configure_file inside
# version.cmake is a no-op when the content matches, so rebuilds only
# cascade when something actually changed.
add_custom_target(update_version ALL
COMMAND ${CMAKE_COMMAND}
-DSRC_DIR=${COMPONENT_DIR}
-DBIN_DIR=${CMAKE_BINARY_DIR}
-P ${COMPONENT_DIR}/version.cmake
BYPRODUCTS ${CMAKE_BINARY_DIR}/version.h
COMMENT "Refreshing version.h from git"
)
add_dependencies(${COMPONENT_LIB} update_version)
endif()

View File

@@ -225,17 +225,84 @@ static void cmd_led(char *args)
OK("led mask=%u", mask);
}
/* BU.LED.WATCH
* LEDs solid (all on) while the physical button is released.
* LEDs waterfall at ~83 ms/step while the button is held.
* Runs indefinitely; any UART byte aborts.
*/
static void cmd_led_watch(char *args)
{
(void)args;
static const uint8_t waterfall[] = {
0b001, 0b011, 0b111, 0b110, 0b100, 0b000
};
const size_t N_WF = sizeof(waterfall) / sizeof(waterfall[0]);
const int64_t step_us = 83000; /* ~83 ms — 3× the 250 ms host-side rate */
int64_t next_step_us = esp_timer_get_time();
size_t wf_i = 0;
int last_pressed = -1; /* force initial emit */
uint8_t last_mask = 0xFF;
while (1) {
/* Abort on any UART input. */
size_t available = 0;
if (uart_get_buffered_data_len(UART_NUM_0, &available) == ESP_OK
&& available > 0) {
uint8_t drain[64];
while (available > 0) {
int n = uart_read_bytes(UART_NUM_0, drain, sizeof(drain), 0);
if (n <= 0) break;
available = (size_t)n < available ? available - (size_t)n : 0;
}
break;
}
i2c_poll_buttons();
bool pressed = i2c_get_button_state(0);
int64_t now_us = esp_timer_get_time();
uint8_t mask;
if (pressed) {
if (now_us >= next_step_us) {
wf_i = (wf_i + 1) % N_WF;
next_step_us = now_us + step_us;
}
mask = waterfall[wf_i];
} else {
wf_i = 0;
next_step_us = now_us; /* so the first press starts from step 0 */
mask = 0b111;
}
if (mask != last_mask) {
i2c_set_led1(mask);
last_mask = mask;
}
if ((int)pressed != last_pressed) {
EVT("led t=%.2f pressed=%d", elapsed_s(), pressed ? 1 : 0);
last_pressed = pressed;
}
esp_task_wdt_reset();
vTaskDelay(pdMS_TO_TICKS(20));
}
i2c_set_led1(0);
OK("led.watch done");
}
static void cmd_adc_once(void)
{
int bat_mv = get_bat_raw_mv();
float bat_V = get_battery_V();
#ifdef BOARD_V5
/* VOC and FAULT pins are unusable on V5 (input-only ESP32 GPIOs
* without external pulls — see README "V5 hardware caveats"); skip. */
int isens_mv = get_isens_raw_mv();
float isens_A = -(isens_mv - 1650.0f) / 13.2f;
int voc_mv = get_voc_raw_mv();
int fault = get_hw_overcurrent_fault() ? 1 : 0;
OK("adc bat_mv=%d bat_V=%.3f isens_mv=%d isens_A=%+.2f voc_mv=%d fault=%d",
bat_mv, bat_V, isens_mv, isens_A, voc_mv, fault);
OK("adc bat_mv=%d bat_V=%.3f isens_mv=%d isens_A=%+.2f",
bat_mv, bat_V, isens_mv, isens_A);
#else
OK("adc bat_mv=%d bat_V=%.3f", bat_mv, bat_V);
#endif
@@ -629,6 +696,7 @@ static const struct cmd_entry CMDS[] = {
{ "FLASH", cmd_flash },
{ "I2C", cmd_i2c },
{ "LED", cmd_led },
{ "LED.WATCH", cmd_led_watch },
{ "ADC", cmd_adc },
{ "ADC.STREAM", cmd_adc_stream },
{ "SENSORS.WATCH", cmd_sensors_watch},

View File

@@ -112,6 +112,7 @@ int8_t fsm_get_current_progress(int8_t denominator) {
case STATE_JACK_DOWN:
case STATE_MOVE_START_DELAY:
case STATE_DRIVE_START_DELAY:
case STATE_DRIVE_FLUFF_START:
case STATE_DRIVE_END_DELAY:
if (timer_end != timer_start)
x = (fsm_now-timer_start)*denominator/(timer_end-timer_start);
@@ -407,12 +408,35 @@ void control_task(void *param) {
break;
case STATE_DRIVE_START_DELAY:
// 1s pause between jack-up and drive — mechanical settling
// 1s quiet pause between jack-up and fluffer spin-up.
// All motors off here so the jack-up current fully settles
// before we energize the fluffer.
if (!get_is_safe()) {
fsm_error = SC_ERR_SAFETY_TRIP;
current_state = STATE_UNDO_JACK_START;
set_timer(JACK_DOWN_TIME);
log = true;
} else if (timer_done()) {
current_state = STATE_DRIVE_FLUFF_START;
log = true;
set_timer((uint64_t)get_param_value_t(PARAM_FLUFF_PREDRIVE_MS).u32 * 1000);
}
break;
case STATE_DRIVE_FLUFF_START:
// Fluffer alone for 1s, then drive+fluffer. Splits the old
// "jack-up+fluff concurrent" sequence so aux never overlaps
// with jack on V5's shared current sensor.
if (!get_is_safe()) {
fsm_error = SC_ERR_SAFETY_TRIP;
current_state = STATE_UNDO_JACK_START;
set_timer(JACK_DOWN_TIME);
log = true;
} else if (efuse_get(BRIDGE_AUX)) {
fsm_error = SC_ERR_EFUSE_TRIP_3;
current_state = STATE_UNDO_JACK_START;
set_timer(JACK_DOWN_TIME);
log = true;
} else if (timer_done()) {
current_state = STATE_DRIVE;
log = true;
@@ -632,11 +656,12 @@ void control_task(void *param) {
case STATE_CALIBRATE_JACK_MOVE:
case STATE_JACK_UP_START:
case STATE_JACK_UP:
// jack up and fluff
// jack up only — fluffer is deferred to STATE_DRIVE_FLUFF_START
// so aux and jack never energize together.
drive_relays((relay_port_t){.bridges = {
.DRIVE=BRIDGE_OFF,
.JACK=BRIDGE_FWD,
.AUX=BRIDGE_FWD
.AUX=BRIDGE_OFF
}});
rtc_reset_shutdown_timer();
log = true;
@@ -661,8 +686,19 @@ void control_task(void *param) {
rtc_reset_shutdown_timer();
log = true;
break;
case STATE_UNDO_JACK_START:
case STATE_DRIVE_START_DELAY:
// Quiet 1s after jack-up — all motors off so jack current
// settles before the fluffer starts.
drive_relays((relay_port_t){.bridges = {
.DRIVE=BRIDGE_OFF,
.JACK=BRIDGE_OFF,
.AUX=BRIDGE_OFF
}});
rtc_reset_shutdown_timer();
log = true;
break;
case STATE_DRIVE_FLUFF_START:
case STATE_UNDO_JACK_START:
case STATE_DRIVE_END_DELAY:
// only fluffer
drive_relays((relay_port_t){.bridges = {

View File

@@ -38,7 +38,13 @@ typedef enum {
STATE_CALIBRATE_JACK_MOVE,
STATE_CALIBRATE_DRIVE_DELAY,
STATE_CALIBRATE_DRIVE_MOVE
STATE_CALIBRATE_DRIVE_MOVE,
/* New — appended here to avoid renumbering existing log entries.
* Runs the fluffer alone for ~1 s between DRIVE_START_DELAY and DRIVE
* so the aux motor never overlaps with the jack (which caused the aux
* e-fuse to spuriously trip on V5's shared current sensor). */
STATE_DRIVE_FLUFF_START
} fsm_state_t;
#define LOG_TYPE_BAT 100
#define LOG_TYPE_CRASH 101

View File

@@ -143,7 +143,16 @@ esp_err_t drive_relays(relay_port_t relay_state) {
BRIDGE_TRANSITION_LOGIC(JACK)
BRIDGE_TRANSITION_LOGIC(AUX)
relay_state.bridges.SENSORS = 1;
/* Sensor rail (P10) powered only when FSM is actively doing something.
* In STATE_IDLE we cut it to save power. Overrides energize a motor
* while FSM is technically IDLE — keep the rail up in that case too
* so overrides that consult sensor state (e.g. JACK_DOWN, which checks
* SENSOR_JACK) still work. */
bool motor_requested = (relay_state.bridges.DRIVE != BRIDGE_OFF ||
relay_state.bridges.JACK != BRIDGE_OFF ||
relay_state.bridges.AUX != BRIDGE_OFF);
relay_state.bridges.SENSORS =
(fsm_get_state() != STATE_IDLE || motor_requested) ? 1 : 0;
if (!get_is_safe())
relay_state.bridges.DRIVE = 0;

View File

@@ -64,7 +64,7 @@ typedef struct {
PARAM_DEF(DRIVE_DIST, f32, 10, "ft", 0.0, 100.0) \
PARAM_DEF(JACK_DIST, f32, 5, "in", 0.0, 10.0) \
PARAM_DEF(DRIVE_KE, f32, 29.2, "n/ft", 1.0, 1e9) \
PARAM_DEF(DRIVE_KT, f32, 2880000, "us/ft", 1.0, 1e9) /* div-critical */ \
PARAM_DEF(DRIVE_KT, f32, 1440000, "us/ft", 1.0, 1e9) /* div-critical */ \
PARAM_DEF(JACK_KT, f32, 1428571, "ms/in", 1.0, 1e9) /* div-critical */ \
PARAM_DEF(KEYCODE_0, u32, 0, "", 0, 0) /* skip */ \
PARAM_DEF(KEYCODE_1, u32, 0, "", 0, 0) \
@@ -104,7 +104,8 @@ typedef struct {
PARAM_DEF(BUILD_VERSION, str, "undefined", "", "", "") \
PARAM_DEF(SAFETY_BREAK_US, u32, 300000, "", 0, 10000000) \
PARAM_DEF(SAFETY_MAKE_US, u32, 1000000, "", 0, 10000000) \
PARAM_DEF(JACK_IS_DOWN, f32, 8.0, "A", 0.0, 200.0) /* deprecated: may duplicate JACK_I_DOWN */
PARAM_DEF(JACK_IS_DOWN, f32, 8.0, "A", 0.0, 200.0) /* deprecated: may duplicate JACK_I_DOWN */ \
PARAM_DEF(FLUFF_PREDRIVE_MS, u32, 2000, "ms", 0, 60000)
// Generate enum for parameter indices
#define PARAM_DEF(name, type, default_val, unit, min, max) PARAM_##name,

View File

@@ -1,7 +1,25 @@
# version.cmake
#
# Dual-mode. When included from CMakeLists.txt it runs once at configure
# time (seeding ${CMAKE_BINARY_DIR}/version.h so the first build has the
# file). When invoked as a standalone script via `cmake -P` with SRC_DIR
# and BIN_DIR set, it re-runs at build time so the SHA / dirty flag stay
# current as commits happen between builds.
if(NOT DEFINED SRC_DIR)
set(SRC_DIR ${CMAKE_CURRENT_LIST_DIR})
endif()
if(NOT DEFINED BIN_DIR)
set(BIN_DIR ${CMAKE_BINARY_DIR})
endif()
# Parent dir of the main/ component is the firmware project root, which
# is inside the outer git repo.
get_filename_component(_GIT_WORK_DIR ${SRC_DIR} DIRECTORY)
execute_process(
COMMAND git describe --tags --always --dirty
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/..
WORKING_DIRECTORY ${_GIT_WORK_DIR}
OUTPUT_VARIABLE GIT_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
@@ -9,29 +27,44 @@ execute_process(
execute_process(
COMMAND git rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/..
WORKING_DIRECTORY ${_GIT_WORK_DIR}
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
execute_process(
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${_GIT_WORK_DIR}
OUTPUT_VARIABLE GIT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S" UTC)
# Fallback if not in a git repo
if(NOT GIT_VERSION)
set(GIT_VERSION "unknown")
endif()
if(NOT GIT_BRANCH)
set(GIT_BRANCH "unknown")
endif()
if(NOT GIT_SHA)
set(GIT_SHA "0000000")
endif()
message(STATUS "Firmware Version: ${GIT_VERSION}")
message(STATUS "Git Branch: ${GIT_BRANCH}")
message(STATUS "Build Date: ${BUILD_DATE}")
# configure_file only touches the output file when content actually changes
# — ninja / make won't needlessly re-compile translation units that include
# version.h if nothing is different.
configure_file(
${CMAKE_CURRENT_LIST_DIR}/version.h.in
${CMAKE_BINARY_DIR}/version.h
${SRC_DIR}/version.h.in
${BIN_DIR}/version.h
@ONLY
)
if(CMAKE_SCRIPT_MODE_FILE)
# Standalone -P invocation: quiet success.
else()
message(STATUS "Firmware Version: ${GIT_VERSION} Branch: ${GIT_BRANCH} SHA: ${GIT_SHA}")
message(STATUS "Build Date: ${BUILD_DATE}")
endif()

View File

@@ -4,6 +4,7 @@
#define FIRMWARE_VERSION "@GIT_VERSION@"
#define FIRMWARE_BRANCH "@GIT_BRANCH@"
#define FIRMWARE_SHA "@GIT_SHA@"
#define BUILD_DATE "@BUILD_DATE@"
#define FIRMWARE_STRING "V_" FIRMWARE_VERSION " (" BUILD_DATE ")"

File diff suppressed because one or more lines are too long

View File

@@ -8,6 +8,7 @@ green: #2a493d
black: #2f2f2f
-->
<head>
<meta charset="utf-8">
<title>Control Panel</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@@ -37,12 +38,33 @@ black: #2f2f2f
#commit_btn[disabled], #cancel_btn[disabled] { background-color: #444 !important; color: #888; cursor: not-allowed; }
table { width: 100%; border-collapse: collapse; text-align: left; }
td { padding: 8px; border-bottom: 1px solid #efede9; }
#log_viewer_table td { padding: 2px 6px; font-size: 0.65rem; }
#log_viewer_table td:first-child { white-space: nowrap; }
summary { border-radius: 5px; font-weight: bold; text-align: left; color: #fff; background-color: #723; padding: 0.3rem;}
.cmd { font-size: 1.5rem; border: none;}
#msg {text-align: center;}
/* Status box: state label plus a flex row of per-error pills. */
#status_box { text-align: center; padding: 6px 0; }
#status_state { font-weight: bold; font-size: 1.3rem; padding: 4px 0; color: #2a493d; }
#status_state.error { color: #c33; }
#status_indicators { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-top: 4px; }
#status_indicators:empty { display: none; }
.status_pill {
padding: 3px 10px;
border-radius: 12px;
font-size: 0.85rem;
font-weight: bold;
color: #ffffff;
background-color: #888;
white-space: nowrap;
}
.status_pill.error { background-color: #c33; }
.status_pill.warn { background-color: #c90; }
.status_pill.info { background-color: #479; }
h1 {
font-size: 2.5rem;
}
@@ -85,8 +107,11 @@ black: #2f2f2f
@media screen and (max-width: 350px) {
#content { max-width: 100%; padding: 0 5px; }
table tr td { display: block; width: 100%; box-sizing: border-box; } /* Stack table cells vertically on mobile for better usability */
table tr { display: block; margin-bottom: 10px; }
/* Stack table cells vertically on mobile for better usability,
* but exempt the log viewer — it stays as a wide table with
* horizontal scroll provided by its wrapping div. */
table:not(#log_viewer_table) tr td { display: block; width: 100%; box-sizing: border-box; }
table:not(#log_viewer_table) tr { display: block; margin-bottom: 10px; }
}
#popup-buttons {
@@ -168,7 +193,12 @@ black: #2f2f2f
<table>
<tr>
<td colspan="3"><input readonly="" id="msg"/></td>
<td colspan="3">
<div id="status_box">
<div id="status_state">&mdash;</div>
<div id="status_indicators"></div>
</div>
</td>
</tr>
<tr>
<td colspan="3"><input type="datetime-local" id="UX_TIME" step="1" readonly=""/>
@@ -191,15 +221,15 @@ black: #2f2f2f
<td><input type="datetime-local" id="UX_NEXT_ALARM" readonly=""/></td>
</tr>
<tr>
<td>Remain. Distance (ft)</td>
<td>Leash (ft)</td>
<td><input type="number" id="UX_REM_DIST" onchange="handleRemainingDistChange(this)"/></td>
</tr>
<tr>
<td>Move Distance (ft)</td>
<td>Move Dist. (ft)</td>
<td><input type="number" min="0" id="UX_DRIVE_DIST" onchange="changeSchedule(this)"/></td>
</tr>
<tr>
<td>Jack Height (in)</td>
<td>Jack Ht. (in)</td>
<td><input type="number" min="0" id="UX_JACK_DIST" onchange="changeSchedule(this)"/></td>
</tr>
<tr>
@@ -294,6 +324,20 @@ black: #2f2f2f
</details>
<br/>
<details id="log_viewer_details">
<summary style="background-color:#2a493d;">EVENT LOG</summary>
<!-- Body breaks out of the 500px #content column so the table has
room to breathe. The summary above stays inside the column. -->
<div id="log_viewer_body" style="position:relative;width:100vw;left:50%;margin-left:-50vw;padding:0 8px;box-sizing:border-box;">
<button onclick="loadLogViewer()" style="width:auto;padding:4px 12px;">Refresh</button>
<div id="log_viewer_msg" style="padding:8px;font-size:0.75rem;"></div>
<div style="overflow-x:auto;">
<table id="log_viewer_table" style="font-family:monospace;font-size:0.65rem;white-space:nowrap;"></table>
</div>
</div>
</details>
<br/>
<details>
<summary>DANGER ZONE</summary>
<table>
@@ -583,7 +627,14 @@ black: #2f2f2f
let intervalId = null;
function remote(command) {
sendCommand(command);
// Fire-and-forget POST. Held-button jog sends this every 150 ms —
// transient NetworkErrors must not pop a modal (would spam the UI
// and race with subsequent sends). Any error is swallowed.
fetch('./post', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({cmd: command})
}).catch(() => {});
try {
navigator.vibrate(200);
} catch (error) {}
@@ -833,6 +884,16 @@ black: #2f2f2f
}
}
// Shared guard: skip writes into fields the user is currently editing
// (focused OR marked .changed). Applies uniformly across the front
// page AND the DANGER ZONE param table.
function _safeSet(el, value) {
if (!el) return;
if (document.activeElement === el) return;
if (el.classList && el.classList.contains('changed')) return;
el.value = value;
}
function updateUI() {
if (!data.rtc_set) {
showRTCSyncModal();
@@ -847,43 +908,51 @@ black: #2f2f2f
if (driftS > 300) showDesyncModal(Math.round(driftS / 60));
}
// Update message + error flags in single msg field
// Status box: state label + per-error pills.
{
const state = Array.isArray(data.msg) ? data.msg[0] || '' : (data.msg || '');
const flags = [];
if (data.errors) {
const e = data.errors;
if (e.efuse_drive) flags.push('DRIVE EFUSE');
if (e.efuse_jack) flags.push('JACK EFUSE');
if (e.efuse_aux) flags.push('AUX EFUSE');
if (e.low_battery) flags.push('LOW BATTERY');
if (e.rtc_not_set) flags.push('CLOCK NOT SET');
if (e.safety_trip) flags.push('SAFETY BREAK');
if (e.leash_hit) flags.push('LEASH LIMIT');
}
const msgEl = ge('msg');
if (flags.length > 0) {
const bin = (data.errors.led_code >>> 0).toString(2).padStart(3,'0');
msgEl.value = state + ' [' + bin + '] ' + flags.join(' | ');
msgEl.style.color = '#c33';
} else {
msgEl.value = state;
msgEl.style.color = '';
// Pills rendered in priority order: hardware errors first,
// then config / housekeeping warnings. Each entry:
// [errorKey, pill text, 'error' | 'warn']
const INDICATORS = [
['safety_trip', 'SAFETY BREAK', 'error'],
['efuse_drive', 'DRIVE EFUSE', 'error'],
['efuse_jack', 'JACK EFUSE', 'error'],
['efuse_aux', 'AUX EFUSE', 'error'],
['low_battery', 'LOW BATTERY', 'warn'],
['leash_hit', 'LEASH LIMIT', 'warn'],
['rtc_not_set', 'CLOCK NOT SET', 'warn'],
];
const errs = data.errors || {};
const activePills = INDICATORS.filter(([k]) => errs[k]);
const stateEl = ge('status_state');
stateEl.textContent = state || '—';
stateEl.classList.toggle('error', activePills.length > 0);
const box = ge('status_indicators');
box.innerHTML = '';
for (const [, label, kind] of activePills) {
const pill = document.createElement('span');
pill.className = 'status_pill ' + kind;
pill.textContent = label;
box.appendChild(pill);
}
}
// Update voltage (read-only)
// Update voltage (read-only — but still skip while focused so a
// user copying the value doesn't lose their selection)
if (data.voltage !== undefined) {
ge('voltage').value = data.voltage.toFixed(2);
_safeSet(ge('voltage'), data.voltage.toFixed(2));
}
if (data.build_version || data.build_date) {
ge('version').value = data.build_version + ' ('+data.build_date+')';
_safeSet(ge('version'), data.build_version + ' ('+data.build_date+')');
}
// Update time (skip if changed or focused)
// Update time
const timeInput = ge('UX_TIME');
if (data.time !== undefined && !timeInput.classList.contains('changed') && document.activeElement !== timeInput) {
if (data.time !== undefined) {
// Treat incoming timestamp as local time (no timezone conversion)
const dt = new Date(data.time * 1000);
const year = dt.getUTCFullYear();
@@ -892,11 +961,16 @@ black: #2f2f2f
const hours = String(dt.getUTCHours()).padStart(2, '0');
const minutes = String(dt.getUTCMinutes()).padStart(2, '0');
const seconds = String(dt.getUTCSeconds()).padStart(2, '0');
timeInput.value = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
_safeSet(timeInput, `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`);
}
const timeOutput = ge('UX_NEXT_ALARM');
if (data.next_alarm !== undefined) {
if (data.next_alarm !== undefined && document.activeElement !== timeOutput) {
if (data.next_alarm > 0) {
// Flip the element back to a datetime-local input so
// the value parses — the "disabled" branch swaps it to
// a plain text input to display a message.
if (timeOutput.type !== 'datetime-local') timeOutput.type = 'datetime-local';
// Treat incoming timestamp as local time (no timezone conversion)
const dt = new Date(data.next_alarm * 1000);
const year = dt.getUTCFullYear();
@@ -906,6 +980,11 @@ black: #2f2f2f
const minutes = String(dt.getUTCMinutes()).padStart(2, '0');
const seconds = String(dt.getUTCSeconds()).padStart(2, '0');
timeOutput.value = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
} else {
// <=0 means firmware has no alarm scheduled (e.g. NUM_MOVES=0).
if (timeOutput.type !== 'text') timeOutput.type = 'text';
timeOutput.value = 'DISABLED';
}
}
// Update parameters
@@ -914,28 +993,34 @@ black: #2f2f2f
updateScheduleInputs();
}
// Update remaining distance (special parameter) - skip if changed or focused
const remainingDistInput = ge('UX_REM_DIST');
if (data.remaining_dist !== undefined && !remainingDistInput.classList.contains('changed') && document.activeElement !== remainingDistInput) {
remainingDistInput.value = data.remaining_dist.toFixed(1);
// Update remaining distance (special parameter)
if (data.remaining_dist !== undefined) {
_safeSet(ge('UX_REM_DIST'), data.remaining_dist.toFixed(1));
}
}
// Keys whose inputs live OUTSIDE the auto-generated DANGER ZONE
// table (in the dedicated WiFi section, or commented out entirely).
// Must be filtered in BOTH the build and update paths — otherwise a
// poll sees "no input for NET_SSID" and force-rebuilds the whole
// table every tick, wiping every in-progress edit.
const PARAM_TABLE_SKIP = new Set(['NET_SSID', 'NET_PASS', 'WIFI_SSID', 'WIFI_PASS']);
function updateParamTable() {
const table = ge('table');
// Sort parameters alphabetically by key
const sortedParams = Object.entries(data.parameters).sort((a, b) => a[0].localeCompare(b[0]));
// Sort parameters alphabetically, pre-filtering keys that don't
// belong in the auto-generated DANGER ZONE table.
const sortedParams = Object.entries(data.parameters)
.filter(([k]) => !PARAM_TABLE_SKIP.has(k))
.sort((a, b) => a[0].localeCompare(b[0]));
if (!paramTableCreated) {
// Create table for the first time
table.innerHTML = '';
const WIFI_PARAM_KEYS = new Set(['NET_SSID', 'NET_PASS', 'WIFI_SSID', 'WIFI_PASS']);
for (const [key, value] of sortedParams) {
if (WIFI_PARAM_KEYS.has(key)) continue; // shown in dedicated WiFi section
const row = table.insertRow();
const cell1 = row.insertCell(0);
const cell2 = row.insertCell(1);
@@ -966,12 +1051,10 @@ black: #2f2f2f
for (const [key, value] of sortedParams) {
const input = ge(`PARAM_${key}`);
if (input) {
// Only update if not changed and not focused
if (!input.classList.contains('changed') && document.activeElement !== input) {
input.value = value;
}
// _safeSet skips changed/focused inputs so in-progress edits survive.
_safeSet(input, value);
} else {
// New parameter - need to rebuild table
// Genuinely new param (unknown key AND not in skip list) → rebuild.
paramTableCreated = false;
updateParamTable();
return;
@@ -1408,6 +1491,260 @@ black: #2f2f2f
}
}
// ---- Log viewer ------------------------------------------------
// Parses the /log endpoint binary blob:
// [4B BE json_len][json_len bytes JSON][4B BE tail][4B BE head][log data...]
// Log data entries (current FW): [len u8][payload (len-1 bytes)][type u8]
// Total per entry = len+1. 0xFF / 0x00 bytes → skip to next 4096 sector.
const LOG_FSM_NAMES = [
'IDLE','MOVE_START_DELAY','JACK_UP_START','JACK_UP',
'DRIVE_START_DELAY','DRIVE','DRIVE_END_DELAY','JACK_DOWN',
'UNDO_JACK_START','CAL_JACK_DELAY','CAL_JACK_MOVE',
'CAL_DRIVE_DELAY','CAL_DRIVE_MOVE','DRIVE_FLUFF_START',
];
const LOG_TYPE_BAT = 100, LOG_TYPE_CRASH = 101, LOG_TYPE_BOOT = 102, LOG_TYPE_TIME_SET = 103;
const LOG_RESET_REASONS = {
0:'UNKNOWN',1:'POWERON',2:'EXT',3:'SW',4:'PANIC',
5:'INT_WDT',6:'TASK_WDT',7:'WDT',8:'DEEPSLEEP',9:'BROWNOUT',10:'SDIO',
};
let logViewerLoaded = false;
const LOG_MONTHS = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
function _logFormatTs(tsMs) {
// Device stores "local time as UTC ms" — display via getUTC* to avoid
// the browser re-applying its own timezone offset.
// Format: 2026APR08 14:23:45.123
if (!tsMs || tsMs <= 0) return '-';
const d = new Date(tsMs);
const pad = (n, w=2) => String(n).padStart(w, '0');
return `${d.getUTCFullYear()}${LOG_MONTHS[d.getUTCMonth()]}${pad(d.getUTCDate())} `
+ `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`
+ `.${pad(d.getUTCMilliseconds(), 3)}`;
}
// Decode the sensors byte: low nibble = debounced stable state,
// high nibble = raw level. Bit order SAFETY / DRIVE / JACK / AUX.
const LOG_SENSOR_NAMES = ['SAFETY', 'DRIVE', 'JACK', 'AUX'];
function _decodeSensors(b) {
const stable = b & 0x0F, raw = (b >> 4) & 0x0F;
const parts = [];
for (let i = 0; i < 4; i++) {
const s = (stable >> i) & 1;
const r = (raw >> i) & 1;
parts.push(`${LOG_SENSOR_NAMES[i]}=${s}${s !== r ? ` (raw ${r})` : ''}`);
}
return parts.join(', ');
}
function _parseLogEntries(bytes) {
const entries = [];
const n = bytes.length;
const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
let i = 0;
while (i < n) {
const b = bytes[i];
if (b === 0xFF || b === 0x00) {
// Skip to next 4096-aligned sector.
i = (Math.floor(i / 4096) + 1) * 4096;
continue;
}
const entryLen = b; // stored len = payload_size + 1
const payloadSize = entryLen - 1;
const endOffset = i + entryLen;
if (endOffset >= n) break; // truncated
const type = bytes[endOffset];
const payloadStart = i + 1;
const entry = { type };
try {
if (type >= 0 && type <= 13 && payloadSize >= 27) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart + 0, true));
entry.bat_V = dv.getFloat32(payloadStart + 8, true);
entry.drive_A = dv.getFloat32(payloadStart + 12, true);
entry.jack_A = dv.getFloat32(payloadStart + 16, true);
entry.aux_A = dv.getFloat32(payloadStart + 20, true);
entry.counter = dv.getInt16(payloadStart + 24, true);
entry.sensors = bytes[payloadStart + 26];
entry.name = LOG_FSM_NAMES[type] || `STATE_${type}`;
} else if (type === LOG_TYPE_BAT && payloadSize >= 12) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart, true));
entry.bat_V = dv.getFloat32(payloadStart + 8, true);
entry.name = 'BAT';
} else if ((type === LOG_TYPE_CRASH || type === LOG_TYPE_BOOT) && payloadSize >= 9) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart, true));
const info = bytes[payloadStart + 8];
entry.reason = LOG_RESET_REASONS[info & 0x0F] || `UNKNOWN(${info & 0x0F})`;
entry.name = type === LOG_TYPE_BOOT ? 'BOOT' : 'CRASH';
} else if (type === LOG_TYPE_TIME_SET && payloadSize >= 8) {
entry.ts_ms = Number(dv.getBigUint64(payloadStart, true));
entry.name = 'TIME_SET';
} else {
entry.name = `UNK(0x${type.toString(16).padStart(2,'0')})`;
}
} catch (e) {
entry.name = 'PARSE_ERR';
}
entries.push(entry);
i = endOffset + 1;
}
return entries;
}
function _entryCells(e) {
// Returns an array of {text, title?} describing each column for
// a single entry. `title` becomes the tooltip (title attribute).
const sensorHex = e.sensors !== undefined
? '0x' + e.sensors.toString(16).padStart(2,'0')
: '';
return [
{ text: _logFormatTs(e.ts_ms) },
{ text: e.name || '' },
{ text: e.bat_V !== undefined ? e.bat_V.toFixed(2) : '' },
{ text: e.drive_A !== undefined ? e.drive_A.toFixed(2) : '' },
{ text: e.jack_A !== undefined ? e.jack_A.toFixed(2) : '' },
{ text: e.aux_A !== undefined ? e.aux_A.toFixed(2) : '' },
{ text: e.counter !== undefined ? String(e.counter) : '' },
{ text: sensorHex,
title: e.sensors !== undefined ? _decodeSensors(e.sensors) : undefined },
{ text: e.reason || '' },
];
}
function _appendRow(table, cells, opts = {}) {
const row = table.insertRow();
if (opts.className) row.className = opts.className;
if (opts.hidden) row.style.display = 'none';
if (opts.onclick) row.addEventListener('click', opts.onclick);
if (opts.style) Object.assign(row.style, opts.style);
cells.forEach(c => {
const td = document.createElement('td');
if (typeof c === 'string') {
td.textContent = c;
} else {
td.textContent = c.text ?? '';
if (c.title) td.title = c.title;
if (c.colSpan) td.colSpan = c.colSpan;
if (c.style) Object.assign(td.style, c.style);
if (c.bold) td.style.fontWeight = 'bold';
}
row.appendChild(td);
});
return row;
}
function _renderLogEntries(entries) {
const table = ge('log_viewer_table');
table.innerHTML = '';
const cols = ['Time','Type','Battery V','Drive A','Jack A','Aux A','Counter','Sensors','Extra'];
_appendRow(table, cols.map(h => ({ text: h, bold: true })));
// Walk newest-first, group contiguous entries sharing the same
// state name. Groups with ≥2 members render as a single clickable
// header row (default collapsed) followed by their entry rows.
let groupId = 0;
let i = entries.length - 1;
while (i >= 0) {
const name = entries[i].name || '';
let j = i;
while (j >= 0 && (entries[j].name || '') === name) j--;
const group = entries.slice(j + 1, i + 1).reverse(); // newest-first
i = j;
if (group.length === 1) {
_appendRow(table, _entryCells(group[0]));
continue;
}
groupId++;
const rowClass = `log-group-${groupId}`;
let collapsed = true;
const firstTs = _logFormatTs(group[group.length - 1].ts_ms);
const lastTs = _logFormatTs(group[0].ts_ms);
const header = _appendRow(table, [{
text: `[+] ${name} × ${group.length} ${firstTs}${lastTs}`,
colSpan: cols.length,
style: { cursor: 'pointer', background: '#efede9',
fontWeight: 'bold', fontSize: '0.7rem' },
}], {
style: { background: '#efede9' },
});
// Defer wiring the onclick until we've appended the child rows.
const childRows = group.map(e =>
_appendRow(table, _entryCells(e), {
className: rowClass,
hidden: true,
}));
header.addEventListener('click', () => {
collapsed = !collapsed;
childRows.forEach(r => r.style.display = collapsed ? 'none' : '');
const cell = header.cells[0];
cell.textContent = `[${collapsed ? '+' : '-'}] ${name} × ${group.length} ${firstTs}${lastTs}`;
});
}
}
async function loadLogViewer() {
const msg = ge('log_viewer_msg');
msg.textContent = 'Connecting...';
try {
const resp = await fetch('./log');
if (!resp.ok) { msg.textContent = `Failed: ${resp.status} ${resp.statusText}`; return; }
// Stream the body so we can report progress as bytes arrive.
// /log sets Content-Length, so we know the total ahead of time.
const total = parseInt(resp.headers.get('Content-Length') || '0', 10);
const reader = resp.body.getReader();
const chunks = [];
let received = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
received += value.length;
const kb = (received / 1024).toFixed(1);
if (total) {
const totalKb = (total / 1024).toFixed(1);
const pct = Math.round((received / total) * 100);
msg.textContent = `Downloading... ${kb} / ${totalKb} KB (${pct}%)`;
} else {
msg.textContent = `Downloading... ${kb} KB`;
}
}
// Concatenate chunks into a single Uint8Array.
const buf = new Uint8Array(received);
{
let off = 0;
for (const c of chunks) { buf.set(c, off); off += c.length; }
}
if (buf.length < 12) { msg.textContent = 'Log response too short.'; return; }
msg.textContent = `Parsing ${received} bytes...`;
const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
const jsonLen = dv.getUint32(0, false);
if (jsonLen > 65536 || 4 + jsonLen + 8 > buf.length) {
msg.textContent = 'Log response malformed.'; return;
}
const binStart = 4 + jsonLen + 8;
const logBytes = buf.subarray(binStart);
const entries = _parseLogEntries(logBytes);
_renderLogEntries(entries);
msg.textContent = `${entries.length} entries (${logBytes.length} bytes)`;
logViewerLoaded = true;
} catch (err) {
msg.textContent = `Error: ${err.message}`;
}
}
// Populate the first time the details section is opened.
function _attachLogViewerToggle() {
const d = ge('log_viewer_details');
if (!d) return;
d.addEventListener('toggle', () => {
if (d.open && !logViewerLoaded) loadLogViewer();
});
}
// Start automatic polling
function startPolling() {
// Initial fetch
@@ -1440,6 +1777,7 @@ black: #2f2f2f
window.onload = function() {
ge('commit_btn').disabled = true;
ge('cancel_btn').disabled = true;
_attachLogViewerToggle();
startPolling();
}
</script>

View File

@@ -4,424 +4,578 @@
#include <Arduino.h>
const unsigned char PROGMEM html_content_br[] = {
0x1b, 0xe2, 0x6a, 0x44, 0x51, 0xab, 0x27, 0x2b, 0x21, 0x60, 0x31, 0x60, 0xb7, 0x1c, 0x5f, 0xa6,
0xc5, 0x34, 0x64, 0x32, 0xe7, 0x59, 0xa9, 0xc5, 0x39, 0xe3, 0xd9, 0x4a, 0x7f, 0x29, 0xfe, 0x08,
0x49, 0x66, 0xdb, 0x7b, 0xdf, 0xa6, 0x7d, 0x6f, 0x7f, 0xbe, 0x44, 0xa0, 0x8a, 0x26, 0x0c, 0x46,
0x36, 0x90, 0x76, 0xa5, 0x8c, 0x29, 0x3d, 0x8e, 0xcb, 0xeb, 0xe7, 0x31, 0x58, 0x21, 0xce, 0x61,
0xf2, 0x80, 0xec, 0x25, 0x06, 0xbe, 0x62, 0xfa, 0xd3, 0xc4, 0x68, 0x6a, 0xd1, 0x20, 0x0c, 0xf6,
0x83, 0x6a, 0x77, 0x03, 0x2f, 0xc3, 0xa5, 0x6d, 0xca, 0xd2, 0x36, 0x73, 0xfa, 0xfa, 0xb6, 0x1c,
0x17, 0x9c, 0x11, 0x79, 0x00, 0xf0, 0xec, 0x2d, 0xa0, 0xb8, 0xcb, 0xc5, 0xd1, 0x7c, 0xb2, 0x42,
0x05, 0x1b, 0xcd, 0xa5, 0x4a, 0x24, 0x2d, 0xa4, 0x37, 0x9b, 0x5a, 0xe2, 0x6c, 0xcb, 0xcd, 0xb3,
0xc4, 0x3d, 0x3c, 0x1f, 0x29, 0xa5, 0xd4, 0xea, 0x20, 0x14, 0x84, 0x46, 0xb4, 0xe4, 0x7f, 0xbf,
0xb7, 0x4c, 0xb3, 0x1c, 0x98, 0x01, 0x31, 0x41, 0x39, 0xa3, 0xc5, 0x2e, 0x13, 0xa4, 0x7f, 0xcf,
0xbd, 0xef, 0x4a, 0x3f, 0xf4, 0x58, 0x9d, 0xa6, 0xd4, 0x3d, 0xa1, 0x4a, 0x93, 0x36, 0x44, 0x29,
0x6f, 0x7c, 0xf7, 0xbd, 0xf7, 0x3b, 0x4a, 0xaa, 0x9e, 0xd6, 0x86, 0x99, 0xd9, 0x3c, 0xbb, 0x4e,
0x69, 0xe4, 0x90, 0x50, 0xc8, 0xd0, 0x94, 0x18, 0x60, 0x33, 0x34, 0xe3, 0x4c, 0xd7, 0xcc, 0xcc,
0x06, 0xcc, 0xba, 0x0d, 0xb1, 0x26, 0x86, 0x11, 0x9c, 0xeb, 0xdc, 0xfe, 0x90, 0xf9, 0xbd, 0xed,
0xd4, 0x6d, 0x3a, 0xe7, 0xbf, 0xd9, 0x42, 0x80, 0x10, 0x42, 0x80, 0x00, 0x6d, 0x67, 0xe8, 0x89,
0xac, 0x96, 0xc0, 0x62, 0x22, 0x65, 0x0f, 0xc4, 0x0e, 0xb8, 0x76, 0x83, 0x09, 0xc8, 0xc0, 0xab,
0x30, 0x10, 0x1c, 0x69, 0xb9, 0xe2, 0x9b, 0x48, 0x0f, 0x8e, 0x7e, 0xaa, 0x3c, 0x21, 0x55, 0x7d,
0x7c, 0x4c, 0x89, 0xbe, 0xe8, 0x2d, 0x55, 0xd3, 0xec, 0x3e, 0x2d, 0xae, 0xdd, 0x6c, 0xf5, 0xcb,
0xb5, 0xf4, 0x5d, 0xde, 0x88, 0x37, 0x59, 0x27, 0xa8, 0x99, 0x99, 0xc5, 0x68, 0xe1, 0xe2, 0x52,
0x73, 0x68, 0x22, 0xa7, 0x5c, 0x42, 0x1c, 0x73, 0x24, 0x8c, 0x82, 0x0d, 0x2b, 0x27, 0x31, 0xd9,
0x36, 0xb3, 0xf3, 0x7f, 0xa7, 0x1c, 0x97, 0x8e, 0x90, 0xb2, 0x0d, 0xbe, 0xfe, 0xf4, 0xf7, 0xc5,
0x9b, 0xd6, 0x97, 0xe3, 0x0e, 0xbf, 0x07, 0x35, 0x35, 0xd6, 0xb4, 0x6c, 0x46, 0x70, 0xbc, 0x2d,
0xdb, 0x26, 0xb9, 0x44, 0x45, 0x89, 0x51, 0x6a, 0x7c, 0xc5, 0x09, 0x22, 0x1e, 0xea, 0x98, 0x3f,
0xce, 0x0f, 0x3a, 0x40, 0x38, 0xf4, 0xe9, 0x98, 0xc8, 0x5e, 0xac, 0xa0, 0xef, 0x47, 0xaf, 0x70,
0x2e, 0x3d, 0xf8, 0x2c, 0x80, 0xc3, 0x4a, 0x6b, 0xd8, 0x0f, 0x45, 0xc1, 0xd3, 0xe8, 0x32, 0x5b,
0xe2, 0x42, 0xa6, 0x09, 0xfb, 0x41, 0xf3, 0x42, 0x54, 0xd1, 0x2d, 0x9f, 0x4c, 0x6e, 0x60, 0x99,
0x87, 0xa7, 0xb3, 0xa5, 0xcb, 0x16, 0x3b, 0x6b, 0x37, 0xc2, 0x0d, 0x19, 0xca, 0x1b, 0xd1, 0x2b,
0x4d, 0x38, 0x31, 0x2d, 0x86, 0x2a, 0xdf, 0xf9, 0x37, 0x02, 0xb4, 0x12, 0x74, 0x45, 0x22, 0x70,
0x40, 0x1e, 0xeb, 0x48, 0x92, 0xbe, 0x16, 0xb1, 0x3f, 0x3f, 0xc0, 0x57, 0x54, 0x4b, 0x77, 0x31,
0x4a, 0xfd, 0x74, 0x1c, 0xf1, 0xdc, 0x77, 0xc8, 0xea, 0x9d, 0x3f, 0x27, 0x8d, 0xb1, 0x6d, 0xd2,
0xdf, 0x8f, 0xc8, 0x81, 0xc1, 0xd9, 0xfd, 0x20, 0x9b, 0x7c, 0xaa, 0x47, 0xc6, 0x10, 0x60, 0x28,
0x0d, 0x1a, 0x6e, 0xc9, 0xf1, 0xf9, 0x85, 0xe9, 0x0c, 0x26, 0x7b, 0x18, 0xb1, 0x6c, 0x81, 0x17,
0x18, 0x2e, 0xbf, 0xeb, 0x81, 0xb5, 0xae, 0x35, 0x8a, 0x89, 0x40, 0xd4, 0x5d, 0xbb, 0xc6, 0x05,
0xe7, 0xf8, 0xc3, 0x4f, 0xe5, 0x3d, 0xb3, 0xd1, 0x89, 0x47, 0xbc, 0x3e, 0x16, 0xae, 0xcf, 0x9e,
0x4e, 0xa7, 0xe0, 0x28, 0x13, 0x97, 0x6c, 0xc5, 0x3d, 0x99, 0x78, 0xcc, 0x80, 0x3c, 0xfa, 0xdc,
0x47, 0xf6, 0x9f, 0x91, 0x15, 0xf9, 0x91, 0xca, 0xa4, 0xae, 0xe1, 0x3c, 0xfe, 0x10, 0x95, 0xf0,
0xb9, 0x89, 0x11, 0xaa, 0x9f, 0x40, 0xe3, 0x71, 0x10, 0xa1, 0x0c, 0x05, 0xfd, 0xb5, 0x93, 0xed,
0x6d, 0x92, 0xe3, 0xef, 0xab, 0x92, 0x78, 0x6c, 0x62, 0x3c, 0x98, 0xe4, 0xfc, 0xb2, 0xd9, 0x73,
0xf4, 0x6f, 0xb6, 0x35, 0x6d, 0xee, 0x94, 0x8b, 0x9b, 0xbc, 0xa2, 0xca, 0x8c, 0x83, 0xeb, 0x57,
0x23, 0xb6, 0xdf, 0x88, 0x2c, 0x98, 0xe4, 0x9c, 0x88, 0x97, 0x45, 0x6a, 0x5b, 0x5e, 0x6e, 0x7b,
0xf1, 0xc5, 0x9f, 0x26, 0xc2, 0x51, 0x3f, 0x9c, 0x2c, 0x46, 0x99, 0x83, 0x2c, 0xf6, 0x91, 0xea,
0xf2, 0x36, 0x3c, 0xb7, 0x79, 0x89, 0xca, 0x2f, 0xc8, 0x4f, 0x72, 0x4f, 0x46, 0x2d, 0xeb, 0xf3,
0xbb, 0xca, 0x7a, 0xd2, 0x39, 0xe6, 0xd3, 0x76, 0x24, 0xaf, 0x48, 0x4b, 0x27, 0x21, 0x34, 0x83,
0x2a, 0x3d, 0x3e, 0xfd, 0xb2, 0xa9, 0xe2, 0x9d, 0xe4, 0x1d, 0x70, 0x3c, 0xfe, 0x63, 0xf6, 0x3c,
0xd0, 0xaa, 0x1d, 0x5b, 0xab, 0x3d, 0x5b, 0x77, 0x59, 0x9d, 0x37, 0x6d, 0xfc, 0xb5, 0x53, 0xfd,
0xdd, 0x7e, 0xa5, 0x79, 0xc4, 0x24, 0x92, 0x89, 0x16, 0xcc, 0x55, 0xdb, 0x93, 0x8d, 0xec, 0x97,
0xa5, 0xc5, 0x23, 0x09, 0xd9, 0xdf, 0x9f, 0x59, 0x84, 0xab, 0x77, 0x46, 0x13, 0x09, 0x70, 0x3e,
0xc4, 0x6c, 0x89, 0xa3, 0xc3, 0xcf, 0x89, 0x88, 0x13, 0x41, 0xea, 0xee, 0xf3, 0xaa, 0xc8, 0x3e,
0xca, 0xec, 0x7d, 0xeb, 0x56, 0x58, 0x7a, 0xf1, 0x84, 0x98, 0x5d, 0x03, 0xcd, 0x01, 0xd3, 0x2e,
0xd8, 0x22, 0xc4, 0x5c, 0x61, 0x0c, 0xe9, 0xea, 0x10, 0xea, 0xad, 0x22, 0xce, 0xdd, 0x2f, 0x49,
0xe4, 0xd6, 0x5e, 0x27, 0xaf, 0x31, 0xa8, 0x1d, 0xcb, 0x5c, 0x26, 0x50, 0xa1, 0xef, 0x52, 0xfd,
0x1e, 0xca, 0x4c, 0x03, 0x1c, 0xae, 0x56, 0xbe, 0x56, 0x3f, 0xbf, 0x59, 0xbd, 0x29, 0xc4, 0x78,
0x90, 0x1f, 0x5e, 0x57, 0x6d, 0x31, 0xc5, 0xb8, 0x67, 0xa5, 0x00, 0x1f, 0x5f, 0x2f, 0x87, 0x5e,
0x22, 0x9d, 0x78, 0xc4, 0x97, 0x57, 0xbe, 0x86, 0xc2, 0x2e, 0xc5, 0xe2, 0xe4, 0x82, 0x87, 0xf5,
0xbe, 0x9d, 0xce, 0x00, 0x20, 0xb7, 0x34, 0xb3, 0xb6, 0x5e, 0x4d, 0xa4, 0x75, 0x44, 0xc8, 0x76,
0xb5, 0x01, 0xc1, 0x22, 0x3f, 0x96, 0x88, 0x87, 0xff, 0x88, 0x50, 0x3a, 0x50, 0x1f, 0x49, 0x40,
0xbd, 0xc4, 0x2d, 0x19, 0x1c, 0xdb, 0x99, 0x99, 0xcc, 0x4e, 0x53, 0x27, 0x91, 0xa4, 0xf2, 0xba,
0x2f, 0xbb, 0x7a, 0x7d, 0xb4, 0x45, 0x5a, 0xd4, 0x65, 0x42, 0xaf, 0x79, 0xbe, 0x5c, 0xf9, 0x28,
0x7f, 0x52, 0x40, 0x91, 0x4a, 0x01, 0x94, 0x85, 0x64, 0xfa, 0x42, 0x27, 0x98, 0x37, 0xf2, 0x32,
0x93, 0x8a, 0xd2, 0x24, 0xc5, 0x8b, 0x9d, 0x96, 0x39, 0xde, 0x32, 0xb6, 0x05, 0xe8, 0x18, 0xbb,
0xb6, 0x1a, 0x9b, 0xbc, 0x50, 0xa6, 0xa5, 0x1c, 0x57, 0x08, 0xaa, 0x07, 0x6b, 0xfb, 0xc6, 0x9e,
0x82, 0x1a, 0xb6, 0xb5, 0x72, 0xa8, 0x3c, 0xdf, 0xb2, 0xf8, 0x81, 0x3a, 0xb8, 0x4f, 0x81, 0xcd,
0xc6, 0xdf, 0x5b, 0xdf, 0x96, 0xb4, 0x9e, 0x62, 0xc5, 0x08, 0x8b, 0x16, 0xaf, 0x8b, 0xf2, 0xec,
0x24, 0xef, 0x69, 0xbc, 0x79, 0xb3, 0xad, 0x95, 0xa8, 0x66, 0xa0, 0xa4, 0x5a, 0xeb, 0x7d, 0x3b,
0x64, 0xeb, 0xe1, 0xd5, 0x2a, 0xa9, 0x5d, 0xb5, 0x28, 0x55, 0x9b, 0xa3, 0x72, 0x08, 0xc9, 0x91,
0xc5, 0xb4, 0x20, 0xd2, 0xc8, 0x35, 0xd7, 0xb2, 0xdb, 0xeb, 0x54, 0x89, 0x21, 0x1a, 0x40, 0x7f,
0x1b, 0xa5, 0x7f, 0xfe, 0xb7, 0x5e, 0x55, 0x19, 0xc8, 0xbf, 0xfc, 0xb8, 0x52, 0x0b, 0xa3, 0x81,
0x92, 0x88, 0x75, 0x0d, 0xb9, 0x28, 0xe4, 0x29, 0xea, 0xac, 0xff, 0x68, 0x6b, 0xea, 0x0b, 0x89,
0x50, 0xbf, 0x4b, 0x36, 0xff, 0xea, 0x20, 0xc8, 0x8c, 0x84, 0x0b, 0x4a, 0xe6, 0x4d, 0x76, 0xec,
0x89, 0xde, 0x24, 0x5c, 0xa8, 0x7c, 0x3f, 0xa4, 0x4b, 0xd1, 0xdf, 0x82, 0x8e, 0xe7, 0x31, 0x7e,
0xea, 0xcd, 0xa9, 0xff, 0xde, 0xe6, 0xc7, 0xf7, 0xfb, 0xa4, 0xbc, 0x90, 0xec, 0x17, 0x8b, 0xf5,
0xb1, 0x3b, 0x35, 0x12, 0xd3, 0xd7, 0x13, 0x69, 0x5d, 0x7c, 0x97, 0x87, 0xe2, 0xbb, 0x64, 0x31,
0xfb, 0x63, 0x8e, 0xde, 0x68, 0xbc, 0xc6, 0xe0, 0xf3, 0x6b, 0xf4, 0xd9, 0x35, 0x4b, 0x3f, 0x0f,
0xaf, 0x35, 0x38, 0xf4, 0x9d, 0x3f, 0x63, 0x96, 0xa7, 0xfd, 0x8c, 0x1f, 0x2e, 0xc8, 0x6b, 0x8f,
0x1b, 0x82, 0xc3, 0xe5, 0xf5, 0xfa, 0x41, 0x43, 0xa8, 0xea, 0xba, 0x8d, 0x4d, 0xed, 0xc7, 0xc7,
0xb0, 0xf1, 0x49, 0x9a, 0x09, 0xdc, 0xbc, 0xf1, 0x44, 0xbc, 0x42, 0x67, 0x69, 0xff, 0x05, 0x0e,
0xc5, 0x49, 0x7a, 0x99, 0x5d, 0xd7, 0x7b, 0x76, 0x50, 0x9a, 0xd0, 0x13, 0x13, 0x73, 0x95, 0x37,
0x69, 0xb5, 0x3f, 0xdb, 0x61, 0x18, 0x48, 0xe3, 0x3b, 0x52, 0xbb, 0x70, 0x6c, 0xd8, 0x1d, 0xb0,
0xc9, 0x05, 0x80, 0xb0, 0x7c, 0x71, 0x9b, 0x83, 0x25, 0x90, 0xcc, 0x7a, 0x78, 0xad, 0xd3, 0x44,
0x24, 0x6f, 0x6a, 0x31, 0xc4, 0x73, 0x4c, 0xab, 0xc0, 0xb8, 0x86, 0xe6, 0xb4, 0x01, 0x9f, 0x77,
0xb4, 0x5b, 0xad, 0xa9, 0x81, 0x1f, 0x87, 0xa6, 0xc5, 0x1c, 0x7d, 0xe3, 0xc5, 0x3c, 0xf6, 0x74,
0xcf, 0x40, 0xae, 0x81, 0x21, 0xa3, 0x32, 0xfb, 0xb7, 0x72, 0xfd, 0xbf, 0x37, 0x5e, 0xc6, 0x49,
0x1b, 0x18, 0x29, 0x62, 0x94, 0xf9, 0x8b, 0x53, 0x46, 0x8e, 0xa6, 0x78, 0x57, 0xf9, 0x77, 0x6a,
0xfb, 0x12, 0xbf, 0xf8, 0x07, 0xe3, 0x15, 0xf9, 0x08, 0x23, 0xf4, 0x6c, 0xef, 0x58, 0xff, 0x36,
0xc7, 0xa8, 0x7b, 0x79, 0x12, 0x8e, 0x80, 0x8a, 0x23, 0x98, 0x4a, 0x37, 0xcc, 0xec, 0x1c, 0xb9,
0xa6, 0x73, 0x00, 0xf5, 0x5e, 0xb9, 0xca, 0x5c, 0xe4, 0xda, 0x80, 0xb5, 0xdb, 0x0b, 0xfb, 0xe9,
0x5c, 0xda, 0x1d, 0xb0, 0xb9, 0x6d, 0xe6, 0xcf, 0xf7, 0x14, 0xf4, 0xda, 0xde, 0xbf, 0x09, 0x88,
0x12, 0x86, 0x0f, 0xf1, 0xdb, 0x4d, 0xf6, 0x19, 0xcf, 0x23, 0x2d, 0xec, 0x09, 0x66, 0x0f, 0xf5,
0xf5, 0x51, 0xfb, 0x26, 0x27, 0x5a, 0x5c, 0xff, 0x0e, 0xd3, 0x87, 0xfa, 0x4e, 0x3b, 0x03, 0x31,
0xb0, 0x8f, 0x27, 0x1e, 0x16, 0xf5, 0xc9, 0x1a, 0x3e, 0xcc, 0xff, 0xed, 0x5c, 0xd8, 0xc7, 0x8d,
0x24, 0x7d, 0xdb, 0xc4, 0xee, 0xa5, 0xf3, 0xcd, 0x1f, 0xd7, 0x6d, 0x6d, 0x21, 0x8d, 0x39, 0x05,
0xa4, 0xc7, 0x1b, 0x5b, 0x08, 0x7d, 0x6d, 0x7d, 0xe2, 0xb5, 0xd8, 0x6d, 0x8f, 0x33, 0xe4, 0x47,
0x2f, 0xbd, 0x98, 0xf2, 0xb8, 0x3a, 0xd5, 0xbc, 0xca, 0x90, 0xee, 0xfc, 0x69, 0xb9, 0xb0, 0x82,
0x76, 0x3d, 0x37, 0x6b, 0x80, 0xa7, 0x3d, 0xc7, 0x78, 0x37, 0xa6, 0xf1, 0x73, 0xd4, 0x3e, 0x6f,
0xfe, 0x28, 0xdd, 0x86, 0x3c, 0x33, 0x68, 0xa4, 0x19, 0x7c, 0xa4, 0xbe, 0xd5, 0xc3, 0xeb, 0x19,
0x4f, 0x69, 0xa9, 0xf9, 0x38, 0xb6, 0xd5, 0x89, 0x97, 0xb3, 0x9e, 0xb8, 0x69, 0xa3, 0x2d, 0xc3,
0x4f, 0x14, 0x77, 0xcb, 0xd8, 0x20, 0xd1, 0x0e, 0x6d, 0xf9, 0x67, 0x1b, 0x8e, 0xf2, 0x5a, 0x03,
0x40, 0x09, 0x35, 0xf9, 0x86, 0x5a, 0x75, 0x3a, 0x43, 0xbd, 0x2e, 0x76, 0x8e, 0xa1, 0x51, 0xda,
0xfc, 0xa5, 0x8a, 0x3e, 0x9a, 0xd1, 0xf2, 0xda, 0xe4, 0x37, 0xea, 0x65, 0xbc, 0xef, 0x3f, 0x35,
0x05, 0x08, 0xdc, 0x92, 0xb1, 0x46, 0x49, 0x54, 0xc2, 0x70, 0x75, 0x6e, 0x34, 0xff, 0x6d, 0x37,
0xe4, 0x42, 0x83, 0x69, 0x0a, 0x85, 0x3c, 0x40, 0x06, 0xb6, 0x9d, 0x2a, 0x21, 0x9a, 0x5b, 0x00,
0xec, 0x17, 0x2f, 0x16, 0xb7, 0xc1, 0x8b, 0xb0, 0xb0, 0xa1, 0xce, 0xa9, 0xa1, 0xa6, 0xf6, 0x2f,
0xea, 0xb8, 0xac, 0x1e, 0xf6, 0x5d, 0xdb, 0x7d, 0xad, 0xf9, 0xa7, 0x6b, 0x6a, 0xc8, 0x74, 0x74,
0x22, 0xbe, 0x21, 0x4b, 0x4f, 0x28, 0x4f, 0x25, 0x21, 0xa1, 0x06, 0x82, 0x8b, 0x27, 0xfe, 0xca,
0xf4, 0xe2, 0x4e, 0x93, 0x68, 0x60, 0x1b, 0x7c, 0xe9, 0xaa, 0xf9, 0x19, 0xfb, 0xe6, 0xa2, 0x1f,
0x75, 0x1c, 0x43, 0xf3, 0xdd, 0x60, 0x4f, 0xc7, 0xd0, 0x7a, 0x90, 0xef, 0xf8, 0x4b, 0x94, 0xff,
0xc4, 0x5a, 0x59, 0x6c, 0x8d, 0x60, 0x68, 0x8d, 0x57, 0xb0, 0x1d, 0xb9, 0xbd, 0x72, 0xc3, 0x0b,
0x9a, 0xcb, 0x66, 0xce, 0x6e, 0xef, 0xd2, 0x7a, 0x93, 0xc5, 0xc2, 0x2d, 0xa4, 0x78, 0x55, 0x42,
0x8c, 0xb2, 0x94, 0x9c, 0xad, 0xb5, 0xb8, 0x67, 0x39, 0x5c, 0x36, 0x38, 0xf2, 0xe3, 0x5a, 0xe9,
0x7a, 0xd7, 0x70, 0x3f, 0x92, 0x35, 0x15, 0x05, 0x1b, 0x33, 0xd1, 0xc3, 0x5c, 0xa6, 0x98, 0x38,
0x4d, 0xbd, 0x14, 0xdb, 0x23, 0x5d, 0x17, 0xff, 0x82, 0xda, 0x0b, 0xef, 0xb8, 0x11, 0xd4, 0x66,
0x06, 0x14, 0x2c, 0x6d, 0xf8, 0x89, 0x71, 0x7f, 0x46, 0x6a, 0x8e, 0x6a, 0x81, 0xf2, 0x26, 0xa9,
0xad, 0x16, 0xc0, 0x37, 0x64, 0x51, 0xe3, 0x55, 0xfe, 0x0e, 0x56, 0x61, 0x90, 0x54, 0x4d, 0x70,
0x52, 0x4d, 0x3c, 0xbd, 0x41, 0x45, 0x89, 0xed, 0x5f, 0xb7, 0x52, 0x14, 0x88, 0x3e, 0x15, 0xc4,
0x5f, 0x11, 0xb9, 0x31, 0xce, 0xf1, 0xd3, 0x67, 0x40, 0xe8, 0x8f, 0xe8, 0xc6, 0x58, 0x82, 0xd1,
0x6e, 0x00, 0xde, 0xa8, 0xf9, 0xce, 0x86, 0xe9, 0x2e, 0x3e, 0xae, 0xf9, 0x26, 0xff, 0x65, 0x86,
0xf8, 0xd2, 0xee, 0xfb, 0x89, 0x76, 0xe3, 0x04, 0xe1, 0x60, 0xd4, 0x74, 0x14, 0x46, 0x97, 0x19,
0x3c, 0x1e, 0x68, 0xa3, 0xe1, 0xa4, 0x19, 0x72, 0x8c, 0xb0, 0x4e, 0xeb, 0xb5, 0x5d, 0xbd, 0xd2,
0xcb, 0x1d, 0xfa, 0xdd, 0x64, 0xd0, 0x18, 0x81, 0x60, 0xce, 0xdc, 0xf8, 0x3d, 0xd0, 0x3c, 0xd9,
0x22, 0xae, 0xc5, 0x6c, 0xb0, 0x07, 0xb1, 0xdd, 0x7d, 0x0e, 0x10, 0x56, 0x50, 0x4b, 0x6a, 0x6f,
0x75, 0x60, 0xaf, 0x78, 0x46, 0xd1, 0x94, 0x19, 0x38, 0xa3, 0xb5, 0x39, 0x73, 0xef, 0xc7, 0xf6,
0x9a, 0xb2, 0x77, 0x7f, 0x34, 0x04, 0x58, 0xf2, 0x8f, 0x94, 0xc0, 0x32, 0x50, 0x0e, 0x43, 0x07,
0x59, 0xfb, 0x7e, 0x60, 0x6a, 0x2d, 0x80, 0x0b, 0x0a, 0xa5, 0xb0, 0x46, 0x10, 0xb3, 0x16, 0x3b,
0x3d, 0xb0, 0xa7, 0x43, 0x5e, 0x2d, 0x38, 0x27, 0x4a, 0xad, 0xbc, 0x85, 0xd3, 0x49, 0x2b, 0x3a,
0x62, 0xab, 0xdf, 0x61, 0xe9, 0x8e, 0xf2, 0x78, 0x4a, 0x6a, 0xa1, 0x2d, 0xd9, 0x48, 0x87, 0x01,
0x8a, 0x8d, 0xa5, 0xf6, 0xd2, 0xcb, 0x56, 0x71, 0xe9, 0x9a, 0xc8, 0x8e, 0xd6, 0x86, 0xc1, 0xe3,
0xe8, 0x80, 0xd2, 0xde, 0x91, 0xd0, 0x18, 0x36, 0xa2, 0x14, 0xd9, 0x48, 0x58, 0x64, 0xc7, 0x80,
0x67, 0xb8, 0xc9, 0x78, 0x0a, 0x45, 0x6c, 0x15, 0x6b, 0x52, 0xc9, 0x25, 0xc4, 0x07, 0x23, 0x7e,
0xdc, 0xc5, 0xd1, 0xc8, 0xda, 0xc8, 0xd8, 0x71, 0xea, 0x7f, 0xd6, 0x40, 0x93, 0x59, 0x56, 0x7a,
0x4e, 0x35, 0x01, 0xb9, 0x42, 0x13, 0xb0, 0x5d, 0x9c, 0x13, 0x79, 0x01, 0x21, 0x71, 0x6d, 0xe1,
0x99, 0xfb, 0x4b, 0x9c, 0xc5, 0x11, 0x41, 0xbc, 0x6d, 0xda, 0xe6, 0x35, 0x73, 0x00, 0x1f, 0xa2,
0xe4, 0xc4, 0x5f, 0xe4, 0xc2, 0x9a, 0x80, 0x40, 0x1c, 0x2d, 0x67, 0x34, 0x33, 0x14, 0xfd, 0x19,
0x52, 0x50, 0x79, 0x6c, 0xb5, 0x09, 0xb2, 0xa7, 0x21, 0x22, 0x7e, 0x96, 0x1c, 0x88, 0x21, 0x86,
0x36, 0x76, 0xb6, 0x2d, 0xa8, 0xdc, 0xe7, 0xb1, 0x91, 0x1c, 0xa4, 0x23, 0x70, 0xf5, 0x95, 0xcb,
0xfb, 0x7c, 0x79, 0x19, 0x23, 0x33, 0xe0, 0x2d, 0x8d, 0xcc, 0x9f, 0x56, 0x49, 0x3c, 0xe0, 0xb2,
0x97, 0x01, 0x07, 0x8e, 0x1b, 0xf5, 0xf7, 0xc9, 0xad, 0xd6, 0x2b, 0xa7, 0x17, 0x66, 0xf7, 0x1a,
0xa5, 0x25, 0xcc, 0x5c, 0xf4, 0x98, 0x4c, 0xc8, 0x78, 0xee, 0xa2, 0xc4, 0x33, 0x97, 0xd8, 0x53,
0xdf, 0x27, 0xf5, 0xde, 0xd5, 0x52, 0x35, 0x07, 0x3c, 0x1b, 0x52, 0xc0, 0x26, 0xdb, 0x20, 0x74,
0xc4, 0x6b, 0x36, 0x80, 0x78, 0x16, 0xde, 0x44, 0x58, 0x57, 0xeb, 0x94, 0x22, 0x8a, 0x6e, 0xd0,
0x14, 0xe1, 0x69, 0xa4, 0xce, 0x0c, 0x64, 0xf8, 0x8a, 0x46, 0x78, 0x79, 0x18, 0x8c, 0x20, 0xae,
0x04, 0xd6, 0x8d, 0x10, 0x49, 0x54, 0xe8, 0x08, 0x12, 0x4e, 0xd2, 0xcf, 0xe8, 0x15, 0x54, 0xc9,
0x4a, 0x82, 0x5c, 0x82, 0x1a, 0x4e, 0x16, 0x59, 0xb2, 0x32, 0x9f, 0xd2, 0x07, 0x9f, 0x4f, 0x55,
0xfe, 0x59, 0x02, 0x33, 0x4a, 0x4f, 0x72, 0xdd, 0x5e, 0x9a, 0xdc, 0x92, 0xf0, 0xfa, 0x2f, 0x68,
0xce, 0x70, 0xd8, 0x43, 0x03, 0xee, 0xf2, 0x3a, 0x9b, 0x94, 0x4c, 0x84, 0xb3, 0xdf, 0x8e, 0xe2,
0x55, 0x0d, 0xd6, 0xea, 0x5b, 0x46, 0xaa, 0x03, 0x8b, 0xd2, 0xf1, 0xb6, 0x52, 0xc4, 0xf6, 0x3c,
0x0a, 0x15, 0xf2, 0x7e, 0x45, 0x13, 0x29, 0xa1, 0x28, 0x1a, 0x6f, 0xfb, 0x8e, 0x9f, 0x90, 0x68,
0x8b, 0x71, 0x7f, 0x78, 0x37, 0x7a, 0xa9, 0xe0, 0xca, 0xc5, 0x0f, 0x63, 0x45, 0xc7, 0x22, 0x6d,
0x67, 0xe5, 0xbe, 0x52, 0x82, 0x78, 0x1d, 0xe3, 0x18, 0x05, 0x2f, 0x3c, 0x5b, 0xd7, 0x61, 0x3a,
0x0d, 0xd6, 0x7b, 0xe4, 0xea, 0xe4, 0xdb, 0x1b, 0x78, 0x77, 0x87, 0x51, 0xeb, 0x07, 0x19, 0xe6,
0xa3, 0xaa, 0xd8, 0xbb, 0x99, 0x3a, 0x63, 0xf8, 0x49, 0x5b, 0xeb, 0x93, 0xa4, 0xd6, 0xed, 0xf3,
0x2d, 0x43, 0xe7, 0xcc, 0xb6, 0x0b, 0x6e, 0x0d, 0x47, 0xff, 0x61, 0x8b, 0x9e, 0x45, 0x8c, 0x39,
0x13, 0xad, 0x56, 0xb1, 0x61, 0xec, 0xe8, 0x84, 0x20, 0x8f, 0x1d, 0x85, 0x7f, 0xe2, 0x44, 0x18,
0x78, 0xb6, 0x63, 0x16, 0x7c, 0x12, 0xe8, 0xe2, 0xf3, 0x69, 0x28, 0x86, 0xb8, 0xa4, 0xea, 0x05,
0xa0, 0xe4, 0x01, 0x5b, 0xd8, 0xcc, 0x19, 0x2d, 0xae, 0x19, 0x59, 0x7b, 0x8b, 0x94, 0xb7, 0x5b,
0xc4, 0x8c, 0x32, 0x9e, 0x02, 0x18, 0x27, 0x61, 0xa8, 0x98, 0xd1, 0xc4, 0xcb, 0x8d, 0x99, 0x02,
0xa0, 0xec, 0x3b, 0xc7, 0x79, 0x97, 0x32, 0xc0, 0xa2, 0x64, 0xc0, 0xce, 0xec, 0x2a, 0xcd, 0xf0,
0xb9, 0xca, 0xd3, 0xfe, 0xa1, 0xb0, 0x40, 0x7e, 0xad, 0xc6, 0xe6, 0x8c, 0x46, 0x20, 0x6a, 0x8a,
0x7c, 0x6a, 0x7c, 0x27, 0x83, 0xb7, 0xba, 0x73, 0xa0, 0xcd, 0x12, 0x2b, 0x66, 0xe8, 0xba, 0x11,
0xf0, 0xde, 0xa9, 0x33, 0xb2, 0x2a, 0xbb, 0x49, 0x68, 0x61, 0xbf, 0xcf, 0x07, 0xac, 0xf2, 0x3d,
0x20, 0x08, 0xa6, 0x61, 0x1b, 0xf3, 0xcd, 0x5d, 0x6c, 0x0c, 0x8a, 0xdd, 0x48, 0x87, 0xb6, 0xf7,
0x5a, 0x5c, 0x73, 0x71, 0x0e, 0x23, 0x7f, 0x3d, 0x93, 0x9e, 0x73, 0x50, 0x80, 0xf6, 0xb5, 0xaa,
0x97, 0xdd, 0x7f, 0xb7, 0x4d, 0x22, 0x77, 0x2d, 0x02, 0x24, 0x41, 0x65, 0xda, 0xcc, 0x14, 0xa7,
0xa9, 0x06, 0xee, 0x78, 0x33, 0x34, 0x06, 0x81, 0xe0, 0x40, 0x3b, 0x55, 0x13, 0x6b, 0xdd, 0xe1,
0x40, 0x95, 0x73, 0x2e, 0x69, 0x91, 0x90, 0x2f, 0xbb, 0x04, 0x78, 0x46, 0x80, 0x0f, 0xfa, 0x1a,
0x10, 0x7b, 0x50, 0x2f, 0x2d, 0xbb, 0xf0, 0x2a, 0x0e, 0xd0, 0x1d, 0xcd, 0xda, 0xea, 0xfd, 0x1c,
0x7e, 0x73, 0x20, 0x5a, 0xde, 0xf3, 0x70, 0x30, 0xd0, 0x66, 0x2d, 0xe2, 0x02, 0xdd, 0x3d, 0x7b,
0xd7, 0x31, 0x0d, 0xd1, 0x75, 0x03, 0x3c, 0xec, 0xf6, 0xed, 0x7d, 0xb7, 0x73, 0x15, 0xfd, 0xab,
0x5e, 0x74, 0xae, 0x94, 0xd1, 0x97, 0x03, 0x6b, 0xfe, 0x00, 0x11, 0xa5, 0x73, 0x66, 0xc7, 0xbb,
0x90, 0xa4, 0x85, 0xa7, 0xff, 0xd7, 0x29, 0x2b, 0x54, 0x35, 0xc7, 0x9e, 0xa6, 0x72, 0x99, 0x5d,
0xd5, 0x4f, 0xff, 0x6b, 0x25, 0x80, 0x94, 0x11, 0x15, 0xb5, 0x7b, 0xdf, 0xbc, 0x5d, 0x9f, 0x59,
0xdf, 0x51, 0x8b, 0x6f, 0x54, 0xb1, 0x28, 0x16, 0xed, 0x8f, 0x4c, 0x6a, 0xc9, 0xb3, 0x22, 0x76,
0x19, 0x53, 0xb4, 0x6e, 0xbc, 0x15, 0x65, 0x7a, 0xe8, 0x37, 0x42, 0xea, 0x93, 0xdc, 0x77, 0xd2,
0xed, 0x6f, 0xa5, 0xec, 0x0d, 0xcb, 0xd5, 0x06, 0x8f, 0x66, 0xe2, 0x70, 0xaa, 0xae, 0xed, 0x57,
0x50, 0xf6, 0xd5, 0x6f, 0xfe, 0x8b, 0x98, 0x8b, 0x26, 0xed, 0x2c, 0xc4, 0xda, 0x09, 0x5d, 0xf1,
0x15, 0x7e, 0xbf, 0xfe, 0x17, 0x95, 0x3a, 0xab, 0x9f, 0x9a, 0xae, 0x8d, 0xcc, 0x5a, 0xd8, 0xc4,
0x9c, 0xd9, 0x28, 0xa9, 0x48, 0x6b, 0x60, 0x15, 0x72, 0x89, 0xb7, 0x22, 0xfe, 0xfa, 0x7a, 0xad,
0xc3, 0x82, 0xdf, 0x08, 0x7a, 0x73, 0xce, 0x40, 0xa7, 0x66, 0x6f, 0xed, 0x1c, 0x81, 0x7e, 0x36,
0x36, 0x23, 0xac, 0x29, 0x60, 0x9e, 0xd2, 0xfb, 0x47, 0xcf, 0xac, 0xa9, 0xc8, 0x1d, 0x8b, 0x3e,
0x78, 0x98, 0x64, 0x3e, 0x38, 0x33, 0x81, 0x3e, 0xbf, 0x42, 0xb3, 0x88, 0x6b, 0x8e, 0x8d, 0x02,
0x71, 0x2e, 0xc4, 0xf8, 0x46, 0x6f, 0x09, 0x09, 0xbd, 0x40, 0xce, 0x3a, 0x6b, 0xdd, 0xa3, 0x45,
0x2b, 0x81, 0xe4, 0xdc, 0xed, 0x16, 0x6a, 0xb5, 0xdc, 0xf9, 0xb6, 0x9c, 0xf6, 0x02, 0x96, 0x3d,
0x81, 0xf9, 0xea, 0x00, 0xd0, 0x1a, 0x2a, 0x6a, 0xa9, 0xd2, 0x6e, 0x4c, 0x59, 0x9c, 0x2d, 0xb0,
0xe9, 0x25, 0x35, 0x55, 0x7f, 0xa0, 0x35, 0x8c, 0xd8, 0xea, 0x36, 0xe4, 0xb3, 0xbf, 0x78, 0x13,
0xfd, 0x73, 0xd2, 0x4d, 0x9e, 0x72, 0xe6, 0x24, 0xea, 0xaa, 0x6a, 0x5f, 0x61, 0x38, 0x02, 0x32,
0x07, 0x52, 0x22, 0x82, 0x74, 0xda, 0xc4, 0xa5, 0x02, 0x76, 0x6f, 0x0d, 0xaf, 0x2e, 0x0c, 0x27,
0xbe, 0x1e, 0xf1, 0x12, 0x63, 0xfc, 0x3b, 0x23, 0xe6, 0xac, 0x32, 0xde, 0x06, 0x2a, 0x76, 0x6f,
0xec, 0x5c, 0x3c, 0xca, 0x04, 0x8a, 0xd1, 0x1e, 0xb1, 0x8f, 0xb1, 0x46, 0x31, 0xe9, 0xa7, 0xf7,
0x58, 0x70, 0x27, 0xc3, 0x69, 0xf2, 0x76, 0x56, 0xb8, 0x7e, 0x60, 0xab, 0xff, 0x33, 0x71, 0x35,
0x36, 0x2e, 0x24, 0x28, 0x71, 0x51, 0xdc, 0x38, 0x5f, 0xdc, 0x26, 0x95, 0x41, 0xf4, 0x89, 0x11,
0xad, 0x2a, 0xee, 0xe8, 0xb9, 0x32, 0xec, 0x45, 0xdb, 0xe5, 0xf1, 0x98, 0xf1, 0x5b, 0x4e, 0x0d,
0x22, 0x04, 0x56, 0x62, 0x9e, 0x22, 0x8b, 0x69, 0xa8, 0xc3, 0x45, 0xe1, 0xf1, 0xd9, 0xa7, 0x48,
0xbc, 0x4d, 0x9e, 0x67, 0xf1, 0xa3, 0xae, 0x26, 0x00, 0x58, 0xe1, 0x19, 0x52, 0x47, 0x30, 0xa5,
0x6d, 0x98, 0x20, 0xe2, 0x7e, 0xec, 0xdc, 0xc8, 0xa0, 0xb9, 0x09, 0x02, 0xbd, 0x2f, 0x3d, 0xc2,
0xa0, 0x7d, 0x4d, 0x1e, 0xae, 0xc2, 0xe1, 0xd6, 0xda, 0x77, 0xcd, 0x20, 0xc4, 0xeb, 0x55, 0x5b,
0x53, 0xe5, 0x07, 0x97, 0x06, 0x9c, 0x87, 0x69, 0x29, 0xf9, 0x9a, 0x6a, 0xc3, 0x4f, 0xf1, 0x9c,
0xc7, 0x8b, 0xea, 0xe9, 0xcb, 0x1d, 0x6a, 0xb9, 0xf3, 0x00, 0xa1, 0x51, 0x8a, 0x80, 0xae, 0x3c,
0x2e, 0x70, 0x85, 0x86, 0xa5, 0x68, 0xf6, 0x22, 0xe4, 0xee, 0x3a, 0xd9, 0x92, 0x4d, 0xa2, 0x8d,
0xbf, 0x8c, 0x27, 0xbf, 0x2a, 0x7f, 0x68, 0x14, 0x11, 0x01, 0xce, 0xa8, 0x21, 0xad, 0xe1, 0xfb,
0xd2, 0x82, 0x3d, 0x0b, 0x09, 0x6b, 0xdc, 0x4e, 0x3a, 0xac, 0xce, 0x2d, 0x18, 0x1a, 0xc0, 0x31,
0x5d, 0x59, 0x4d, 0x41, 0xd0, 0xaa, 0x1c, 0x97, 0x72, 0x83, 0x47, 0x0e, 0x48, 0x43, 0x83, 0x25,
0x1a, 0x25, 0x17, 0x9b, 0xa1, 0xd2, 0x15, 0x79, 0xf4, 0x99, 0x34, 0x3e, 0x51, 0x8f, 0xaa, 0x6a,
0xd7, 0x11, 0xef, 0x94, 0x4a, 0x9d, 0x8c, 0xc7, 0x56, 0x62, 0x21, 0xf7, 0x0e, 0x5a, 0xe3, 0xb1,
0xc2, 0x4e, 0x1f, 0xe0, 0x97, 0x4b, 0x05, 0xda, 0x19, 0x3c, 0x88, 0x9d, 0x2a, 0xc9, 0x90, 0x06,
0x0b, 0xa5, 0x83, 0x03, 0x7d, 0x07, 0xc8, 0x68, 0x10, 0x7b, 0x61, 0xc9, 0x7a, 0x1c, 0xa4, 0xe8,
0xfb, 0xc0, 0x30, 0x85, 0xc4, 0x26, 0x1c, 0x57, 0x95, 0xaf, 0x97, 0x61, 0x58, 0x36, 0x4f, 0x4e,
0x1f, 0xcb, 0xc8, 0xe5, 0xfd, 0x7e, 0xc5, 0x30, 0xa6, 0xd1, 0xf3, 0xfb, 0x75, 0x22, 0xa2, 0xd4,
0xbf, 0xf3, 0xa4, 0xca, 0xef, 0x78, 0x1b, 0x63, 0x33, 0x1a, 0x30, 0xe1, 0xe7, 0x45, 0x66, 0xfd,
0x01, 0x83, 0x81, 0x18, 0x4c, 0x6d, 0x59, 0xb9, 0xba, 0x67, 0x46, 0x38, 0xf5, 0x34, 0x10, 0xba,
0x0c, 0x9b, 0x5a, 0x4c, 0x95, 0xde, 0x30, 0x80, 0x52, 0x4c, 0xe4, 0xcd, 0x73, 0x32, 0x51, 0xe1,
0x85, 0x3d, 0x37, 0x2d, 0xfa, 0x97, 0x45, 0x21, 0xd7, 0x87, 0x05, 0x25, 0x9e, 0x67, 0xec, 0xa8,
0x60, 0x5d, 0xa7, 0x15, 0x20, 0x6b, 0x24, 0x65, 0xa5, 0x2a, 0x0e, 0x65, 0x57, 0x35, 0x5f, 0xc8,
0x9c, 0xea, 0xa4, 0xcc, 0xa0, 0x14, 0x43, 0x42, 0xfa, 0x28, 0xfd, 0xbb, 0xba, 0x72, 0x19, 0xb9,
0x28, 0x2a, 0xf7, 0x47, 0x2a, 0x7a, 0xe2, 0x76, 0xca, 0xee, 0x20, 0x1a, 0xdc, 0x99, 0x14, 0x74,
0x5d, 0xf9, 0xea, 0x09, 0x08, 0x03, 0xbe, 0xdd, 0xc3, 0xae, 0x51, 0xc8, 0x78, 0x28, 0x38, 0xc7,
0xf4, 0xf2, 0xbd, 0x9c, 0x09, 0x2a, 0x2f, 0x8a, 0x03, 0x5e, 0x2c, 0x7b, 0xba, 0x5c, 0x91, 0x71,
0x21, 0x63, 0xe9, 0x81, 0x77, 0x7f, 0x76, 0x0c, 0x49, 0x9e, 0xd6, 0x74, 0xcc, 0x59, 0x04, 0xef,
0x82, 0xd2, 0x7b, 0x61, 0x60, 0x6d, 0x9c, 0x9c, 0xda, 0xe1, 0xd7, 0x09, 0xa8, 0xb9, 0x5a, 0x2c,
0x62, 0x01, 0x3d, 0xa3, 0x0e, 0x70, 0x3b, 0xfc, 0x87, 0x6c, 0xdc, 0xdc, 0x12, 0x87, 0x83, 0x8d,
0x4a, 0x9e, 0x47, 0x63, 0xfc, 0x2b, 0x5a, 0xce, 0x36, 0x10, 0xcf, 0x45, 0x46, 0xe8, 0xfb, 0x6a,
0x65, 0x7d, 0x9d, 0xc4, 0x9a, 0x76, 0x05, 0xa2, 0x6e, 0x65, 0xdd, 0x56, 0xbb, 0xa0, 0x09, 0x75,
0xce, 0x20, 0x5a, 0xe9, 0x15, 0xed, 0x0c, 0xa5, 0x49, 0xd1, 0x10, 0xb7, 0xb0, 0xd2, 0x33, 0x3d,
0xd0, 0x3b, 0x0f, 0x87, 0x9e, 0x75, 0x08, 0x14, 0x6e, 0xb5, 0x4f, 0xe3, 0xae, 0x53, 0x95, 0x4f,
0xe8, 0xc7, 0xc4, 0x5a, 0x6e, 0xe4, 0x5e, 0x44, 0xf2, 0xb5, 0x4a, 0x44, 0x51, 0x8a, 0x30, 0x24,
0x46, 0xde, 0xcb, 0xd5, 0x28, 0xf5, 0x5d, 0x0a, 0xe3, 0xfa, 0x02, 0x7f, 0x72, 0x6a, 0x2d, 0xc4,
0x6f, 0xba, 0xf1, 0x97, 0xf5, 0xbf, 0xc6, 0xf8, 0xd4, 0x82, 0x8f, 0x94, 0x45, 0xc5, 0x7c, 0x00,
0x6e, 0x26, 0x33, 0x0a, 0x71, 0x2b, 0xc6, 0x1f, 0x98, 0x16, 0x42, 0xd0, 0xc3, 0xfe, 0x08, 0xe7,
0xde, 0xb6, 0x28, 0xc3, 0x57, 0x46, 0xa2, 0xa4, 0x50, 0x7d, 0xa0, 0x1f, 0x1a, 0x77, 0x52, 0x3b,
0x77, 0x43, 0x0b, 0x63, 0x0c, 0x83, 0x76, 0x38, 0x47, 0xf6, 0x27, 0x0b, 0x2c, 0xad, 0x64, 0xbb,
0x6d, 0x21, 0xdf, 0xe2, 0xca, 0xe6, 0x66, 0x36, 0x25, 0xe7, 0x4d, 0x8a, 0xe2, 0x29, 0x0d, 0x83,
0xbc, 0x5a, 0x18, 0xec, 0xa5, 0x95, 0x14, 0x28, 0x99, 0x92, 0x2b, 0x59, 0x6b, 0x91, 0x28, 0x3f,
0x60, 0x63, 0x2b, 0x60, 0x3a, 0x18, 0x37, 0x86, 0xd8, 0x7f, 0x02, 0xfc, 0x8f, 0x90, 0xa8, 0x71,
0x0e, 0x51, 0x60, 0x8f, 0x35, 0xac, 0xd2, 0xcc, 0x61, 0x03, 0x9b, 0x6c, 0x96, 0x72, 0x16, 0x50,
0x62, 0xec, 0xf3, 0x62, 0x61, 0xf6, 0x1a, 0xd1, 0xbc, 0x46, 0x19, 0x7b, 0x85, 0xd5, 0x1f, 0xb2,
0x4e, 0x99, 0x78, 0xe5, 0x43, 0x9b, 0x27, 0x44, 0x65, 0xa8, 0x83, 0x9c, 0xb9, 0x55, 0x3e, 0x69,
0x64, 0x3f, 0xb2, 0x97, 0xc8, 0x13, 0xe3, 0xc8, 0x2a, 0x1c, 0xe4, 0x16, 0x8c, 0xab, 0x17, 0x10,
0xc3, 0x06, 0x07, 0x4e, 0x05, 0xb1, 0x0b, 0x70, 0x4a, 0xbb, 0xfa, 0xe5, 0x95, 0x3c, 0x6e, 0x98,
0x40, 0xe8, 0x73, 0xc4, 0x03, 0xe4, 0x23, 0x0d, 0x47, 0x83, 0x71, 0xbb, 0x64, 0xd9, 0x66, 0xc0,
0x2c, 0xe8, 0x07, 0x62, 0x9c, 0x65, 0x90, 0x4b, 0xa7, 0x80, 0xf4, 0xe5, 0x03, 0x9e, 0x70, 0x9c,
0x88, 0x58, 0xff, 0x6f, 0x8d, 0xb5, 0x36, 0x26, 0x52, 0x7d, 0xd3, 0x05, 0x0c, 0x80, 0xd7, 0x1f,
0xf1, 0x18, 0xf5, 0x78, 0x14, 0xe5, 0xbc, 0x50, 0x78, 0xaa, 0x3d, 0x23, 0x7a, 0x7e, 0xb6, 0xec,
0xd7, 0xff, 0xc4, 0xd9, 0x8a, 0x47, 0x30, 0xa7, 0x23, 0x83, 0xd0, 0x60, 0x40, 0x2f, 0x2c, 0xf0,
0xb2, 0xa1, 0xb8, 0x3e, 0x08, 0xa9, 0x50, 0x87, 0x8a, 0xa2, 0x2e, 0xd7, 0xd2, 0x0d, 0x73, 0xf0,
0x92, 0xa1, 0x4d, 0x45, 0xda, 0x30, 0x87, 0xb7, 0xb9, 0x94, 0x73, 0x4e, 0xae, 0x1a, 0xf7, 0xbf,
0xd3, 0xa5, 0x83, 0x0f, 0xda, 0xfe, 0x0b, 0x5a, 0xe1, 0x31, 0xc8, 0xb3, 0x3c, 0xe8, 0x74, 0xad,
0x25, 0xf6, 0x3f, 0xc7, 0x1a, 0xe6, 0x48, 0x50, 0xb2, 0x81, 0xb3, 0x26, 0x06, 0x60, 0x99, 0xa7,
0x94, 0xda, 0xcb, 0x31, 0x5e, 0x15, 0xcf, 0x44, 0x61, 0xe2, 0x9c, 0x1a, 0x23, 0x7a, 0xd8, 0x6d,
0x00, 0x29, 0x72, 0xe5, 0x45, 0x31, 0x35, 0xd2, 0xa3, 0x2d, 0x30, 0xc3, 0x5d, 0xfd, 0x79, 0x60,
0xac, 0x84, 0x3d, 0x84, 0xe1, 0xae, 0xe0, 0x19, 0x22, 0x66, 0x7d, 0x8c, 0x05, 0x41, 0x5a, 0x61,
0x71, 0x15, 0x01, 0x39, 0xf0, 0xd3, 0xc8, 0xd5, 0xab, 0x6a, 0x07, 0x43, 0xf5, 0xa3, 0x26, 0x79,
0x98, 0x25, 0x86, 0xd4, 0x6b, 0x13, 0x0d, 0x45, 0x50, 0x6d, 0x08, 0xe1, 0x89, 0x17, 0xe8, 0x4a,
0x7f, 0xfd, 0x85, 0xfb, 0xe1, 0x98, 0x89, 0x4d, 0x42, 0xf6, 0x3a, 0xd6, 0xf1, 0xd5, 0xd1, 0x8e,
0xa5, 0x8e, 0x75, 0xbc, 0x74, 0x42, 0xc7, 0x42, 0xc7, 0x3b, 0xce, 0xc9, 0x3c, 0xaf, 0xc0, 0xaa,
0xbd, 0xf2, 0xcb, 0xfb, 0x33, 0x32, 0xda, 0x19, 0xcf, 0x2c, 0x8c, 0x82, 0xd2, 0x16, 0xde, 0xe4,
0x01, 0x1f, 0x26, 0xd6, 0x6a, 0x5d, 0x3b, 0x09, 0xeb, 0x38, 0x8a, 0x42, 0x6c, 0x94, 0xb2, 0xdf,
0x16, 0x48, 0xa8, 0xd1, 0x97, 0xb8, 0x50, 0x07, 0x49, 0xbe, 0x55, 0xee, 0x77, 0xc6, 0xd0, 0x9d,
0xe3, 0xb6, 0x86, 0xf9, 0xbd, 0x57, 0xd8, 0xb2, 0x71, 0xbd, 0xe1, 0x96, 0xd1, 0x67, 0x8e, 0xdd,
0xa2, 0xd1, 0xf8, 0x2d, 0x48, 0xe5, 0xc8, 0x93, 0x0c, 0x6b, 0x36, 0x51, 0x8b, 0xef, 0xe7, 0x83,
0x44, 0xdf, 0xb9, 0x50, 0xd0, 0x6d, 0x0d, 0xb4, 0x6d, 0x6e, 0xbe, 0x65, 0x91, 0xf6, 0x81, 0x74,
0xd3, 0xee, 0x33, 0x03, 0xd0, 0x30, 0x0a, 0xc7, 0xf6, 0x0a, 0x69, 0x37, 0x7c, 0xdd, 0xa3, 0x2e,
0xea, 0xd3, 0xce, 0x85, 0x7d, 0xa7, 0x7c, 0xe8, 0xa1, 0xc0, 0x9a, 0xd6, 0x01, 0xa3, 0xcb, 0x6f,
0xf9, 0x7d, 0x8d, 0xaf, 0xd3, 0x07, 0xc8, 0xa6, 0xd7, 0x89, 0x49, 0x27, 0xf0, 0x8e, 0xe3, 0xf0,
0x79, 0xf6, 0x2b, 0x5f, 0xf4, 0x85, 0xeb, 0x83, 0xfb, 0x90, 0x7f, 0x9e, 0x6a, 0xbf, 0xb6, 0x96,
0x5f, 0x5c, 0x5e, 0xd8, 0x03, 0x5c, 0xf6, 0xc1, 0x4f, 0x44, 0xe8, 0x2e, 0xaa, 0x8b, 0xe2, 0xcb,
0x1a, 0xfc, 0xd9, 0xfe, 0xf8, 0x24, 0x25, 0xea, 0x13, 0x6f, 0xcb, 0xb7, 0xf5, 0x33, 0x23, 0x0e,
0x66, 0x15, 0x27, 0x55, 0x58, 0xd2, 0x36, 0x55, 0x46, 0xeb, 0x33, 0xa3, 0x42, 0x42, 0x36, 0x19,
0xf9, 0x75, 0x50, 0xad, 0x04, 0xe1, 0x34, 0xcf, 0x2d, 0x1c, 0xf1, 0xcb, 0xd1, 0x4c, 0x2e, 0x7a,
0xf9, 0xa4, 0xf0, 0xae, 0x88, 0x34, 0x84, 0x58, 0xff, 0x43, 0x63, 0x56, 0x45, 0x0c, 0x97, 0x85,
0x43, 0x2e, 0x15, 0x0f, 0x9d, 0xa4, 0xe3, 0x52, 0x79, 0x2e, 0xab, 0x83, 0x62, 0x40, 0x5b, 0xdc,
0x1e, 0x09, 0x25, 0xa9, 0xf3, 0x88, 0xfb, 0xab, 0xbb, 0x89, 0x80, 0x15, 0x86, 0x19, 0xb5, 0xd3,
0x62, 0xf1, 0x30, 0x2b, 0xb3, 0x6b, 0x6a, 0xa3, 0xb6, 0x05, 0x0a, 0xae, 0xac, 0xea, 0x04, 0x00,
0xca, 0x98, 0xef, 0x4b, 0xeb, 0x70, 0xb9, 0xaf, 0x67, 0x00, 0x18, 0x6c, 0x74, 0xaf, 0xaf, 0x2a,
0x9d, 0xbd, 0xd9, 0xc3, 0x61, 0x39, 0x31, 0x81, 0x4a, 0x00, 0x16, 0x33, 0xfa, 0x16, 0xb1, 0x7e,
0xa0, 0x21, 0x2b, 0x13, 0x43, 0x10, 0xeb, 0x63, 0x06, 0xce, 0x1e, 0x29, 0x41, 0x4d, 0x7b, 0x28,
0x6c, 0xc7, 0xf9, 0x46, 0x7f, 0xa0, 0x7b, 0x76, 0x6a, 0x4a, 0xe1, 0x9f, 0x84, 0xd6, 0x2f, 0xe9,
0x29, 0x14, 0x95, 0xe2, 0x92, 0xd8, 0x90, 0xe7, 0x8b, 0x7c, 0xc4, 0x1c, 0x2a, 0x6f, 0xdb, 0x08,
0xd0, 0x2c, 0x7b, 0x3d, 0xfe, 0xb7, 0xef, 0x58, 0x0d, 0xa0, 0x26, 0xea, 0xdf, 0xd5, 0x46, 0xcd,
0xbb, 0xfe, 0xd4, 0xbd, 0xeb, 0x4d, 0xef, 0xf5, 0xef, 0xc9, 0xf7, 0x86, 0xc4, 0xde, 0xca, 0x5b,
0xc1, 0x67, 0xdb, 0xff, 0xc5, 0x8f, 0xc4, 0xdf, 0x30, 0x51, 0xef, 0xab, 0xda, 0xd4, 0x74, 0x13,
0x95, 0xb5, 0x91, 0x6f, 0x6d, 0x73, 0x14, 0x88, 0xa3, 0x7f, 0xf5, 0xdd, 0x80, 0x23, 0x4f, 0x46,
0x5d, 0xd2, 0xda, 0xe4, 0xcd, 0x0b, 0xef, 0x9a, 0x84, 0x4f, 0xc0, 0x03, 0x2c, 0x63, 0x8b, 0x54,
0x6a, 0x2a, 0x50, 0xbc, 0x34, 0x68, 0x05, 0xfc, 0xc2, 0xdf, 0x02, 0xdf, 0x26, 0x39, 0x5a, 0x38,
0x43, 0x4c, 0x97, 0x11, 0x70, 0x7b, 0x6a, 0x6d, 0x56, 0x68, 0xdc, 0xc7, 0xfc, 0xa6, 0x4c, 0xec,
0x25, 0xa9, 0x27, 0xb0, 0x44, 0x10, 0x03, 0xea, 0xcb, 0xf9, 0x39, 0xc2, 0x8c, 0x6f, 0xaa, 0x7d,
0xbc, 0x4d, 0xb4, 0x0f, 0x60, 0xb8, 0xbd, 0xa3, 0xc1, 0x42, 0xe4, 0x55, 0xe8, 0x15, 0xc2, 0x77,
0x0e, 0x87, 0x7e, 0xf4, 0x5e, 0xa6, 0x9e, 0x2c, 0x4f, 0x28, 0xaf, 0xb5, 0x6d, 0x20, 0x24, 0x54,
0xe1, 0xa5, 0x58, 0x7b, 0x62, 0xd9, 0x2e, 0x20, 0x0d, 0x84, 0xf5, 0x3a, 0x2b, 0x28, 0x79, 0xae,
0x17, 0x57, 0x34, 0xc5, 0x99, 0x67, 0xcd, 0x36, 0x5a, 0x79, 0x80, 0x3d, 0x19, 0xa9, 0xae, 0xc8,
0x44, 0xa5, 0x24, 0x2c, 0xac, 0x7f, 0xfa, 0xa0, 0xd7, 0xe2, 0xbc, 0x6a, 0xd1, 0x6c, 0x0a, 0xed,
0xf8, 0x8d, 0xa5, 0xb6, 0xe9, 0x4b, 0x8d, 0xd4, 0x08, 0x46, 0x9d, 0x64, 0x5a, 0x88, 0x45, 0x20,
0x34, 0xa2, 0xbb, 0x07, 0x95, 0x7c, 0x0e, 0x0b, 0xed, 0xc6, 0x36, 0xca, 0xcc, 0xf7, 0xfd, 0x0a,
0x36, 0x05, 0xbf, 0xc7, 0xd5, 0x0d, 0xa0, 0x09, 0x7c, 0x0a, 0xb5, 0xfd, 0xcc, 0xb4, 0x77, 0x80,
0xdc, 0x78, 0xdd, 0x93, 0x2b, 0xc1, 0x23, 0x10, 0x62, 0x69, 0xc8, 0xc9, 0x5b, 0xba, 0x8b, 0x74,
0x46, 0xd5, 0x05, 0x18, 0x7b, 0x86, 0xd3, 0xc0, 0x8a, 0x2a, 0xf2, 0xf3, 0x4b, 0x76, 0xad, 0xfd,
0xe7, 0x36, 0xd6, 0x7b, 0xac, 0x30, 0xd7, 0x29, 0xf1, 0xb2, 0x86, 0x8e, 0xba, 0x7f, 0x69, 0x3f,
0xde, 0x6f, 0xd6, 0x4f, 0xc1, 0xdb, 0xb1, 0xcd, 0xfb, 0x5b, 0x57, 0x34, 0x3e, 0x16, 0xd3, 0x74,
0x10, 0x45, 0x4b, 0xd4, 0x94, 0x5f, 0x65, 0x40, 0x31, 0x8e, 0x8e, 0x36, 0x71, 0x91, 0xae, 0xcd,
0x73, 0x3d, 0x8c, 0x86, 0x2b, 0xdb, 0x36, 0xb0, 0x4e, 0x62, 0x02, 0x51, 0xc7, 0x64, 0x8c, 0x4c,
0x59, 0xea, 0x7a, 0x41, 0x98, 0xe1, 0x6e, 0xc2, 0x1d, 0x22, 0x4a, 0x09, 0xa4, 0xd5, 0x00, 0x94,
0xaa, 0xd3, 0x5a, 0xf5, 0x30, 0x73, 0x19, 0x0a, 0x7b, 0x45, 0x3c, 0xc7, 0xd4, 0xbd, 0xa0, 0x8c,
0x36, 0xcb, 0xe8, 0x19, 0xf2, 0x00, 0xed, 0x8d, 0x07, 0xcd, 0xa7, 0x75, 0x5b, 0x8f, 0x52, 0xad,
0x97, 0xf2, 0x4b, 0x01, 0xe2, 0xeb, 0x82, 0x80, 0x80, 0x6e, 0xf4, 0x64, 0x5b, 0x3c, 0x0b, 0x2a,
0xf1, 0xe3, 0xba, 0x53, 0x97, 0x91, 0x2e, 0x6c, 0x97, 0x81, 0x6c, 0xa9, 0x09, 0x56, 0x92, 0xd3,
0x06, 0xf6, 0x04, 0x55, 0x1e, 0xb5, 0xa1, 0x48, 0x85, 0x9a, 0xa7, 0x18, 0x22, 0xef, 0x36, 0xbc,
0xb3, 0x23, 0xca, 0x3c, 0x3d, 0x23, 0x75, 0x3c, 0x4a, 0xba, 0xf4, 0x9c, 0x8b, 0x4d, 0xf4, 0x4d,
0x7b, 0x1d, 0xb2, 0x21, 0xc1, 0xa6, 0x0a, 0x84, 0x3a, 0x36, 0x5c, 0x97, 0xa1, 0x9c, 0x2a, 0x23,
0x18, 0xf1, 0xe1, 0x91, 0x22, 0xd3, 0x70, 0xcb, 0x2b, 0x7b, 0xa7, 0xb4, 0x62, 0x49, 0x47, 0x06,
0x17, 0x78, 0x58, 0xdc, 0x6a, 0x75, 0x7a, 0xd1, 0x0f, 0x37, 0xb2, 0x3e, 0x3a, 0xfb, 0xab, 0x7b,
0xe9, 0x5a, 0x5a, 0x31, 0x3a, 0x22, 0x63, 0x76, 0x34, 0x69, 0xe3, 0xc2, 0xd0, 0x4e, 0x72, 0xe8,
0x1f, 0x3a, 0x81, 0xbe, 0x00, 0xd0, 0x5f, 0xb5, 0x6a, 0xc0, 0xab, 0x0a, 0x88, 0x37, 0x50, 0x33,
0xe2, 0xe2, 0x67, 0x57, 0x80, 0x3c, 0x0a, 0x53, 0x6c, 0x24, 0x25, 0xe9, 0xac, 0x7f, 0xa0, 0xa3,
0xd3, 0x7b, 0x7b, 0x7f, 0xa8, 0x7f, 0x06, 0x60, 0x3d, 0x30, 0x38, 0x9b, 0x0c, 0x03, 0xe6, 0x79,
0xc8, 0xe0, 0xa1, 0x9f, 0x48, 0xa9, 0x98, 0x3f, 0x1c, 0x27, 0xed, 0xd0, 0x52, 0x34, 0x60, 0xd1,
0x14, 0x3f, 0x52, 0x20, 0x8f, 0x61, 0xc5, 0x48, 0x6d, 0x8c, 0xb6, 0x32, 0xef, 0xfa, 0xf6, 0xbe,
0xfb, 0xbc, 0xc2, 0xd3, 0x67, 0xea, 0xd7, 0x5f, 0x5b, 0xce, 0x19, 0x18, 0x89, 0xfd, 0x84, 0xa7,
0xca, 0x04, 0x6c, 0x2c, 0xc5, 0x39, 0x87, 0xba, 0x8c, 0x0a, 0xb9, 0x52, 0xc0, 0x71, 0x9b, 0x00,
0x0a, 0xf6, 0xc7, 0x49, 0x45, 0xc6, 0xa4, 0x73, 0xc3, 0xa3, 0x8d, 0xaa, 0xf2, 0x6b, 0x19, 0x8e,
0xf8, 0x65, 0x6b, 0x1c, 0xf6, 0x9a, 0x25, 0x3f, 0xd1, 0xe5, 0xae, 0x10, 0x7a, 0xba, 0xf6, 0x7d,
0x28, 0xb4, 0x2b, 0x0c, 0xfe, 0x29, 0x94, 0xa3, 0xbc, 0xbb, 0xbd, 0x86, 0xbc, 0x73, 0xde, 0x98,
0xef, 0x03, 0x24, 0x79, 0x31, 0x54, 0x49, 0x9d, 0x63, 0x2a, 0xa5, 0xba, 0x73, 0x35, 0xd9, 0xdc,
0x62, 0x52, 0x9d, 0x20, 0xec, 0x44, 0xd0, 0x42, 0x40, 0x96, 0x19, 0x8d, 0x21, 0xa9, 0x5d, 0xe9,
0xe5, 0x94, 0x95, 0xe2, 0xbd, 0x85, 0x77, 0x9d, 0x4d, 0xac, 0x9d, 0x27, 0xee, 0xd2, 0x01, 0x9e,
0x68, 0xa4, 0x55, 0xd4, 0x97, 0x68, 0x3a, 0xd3, 0xe6, 0x54, 0x1f, 0x78, 0x25, 0x4b, 0x6c, 0x75,
0x19, 0x71, 0xb5, 0x04, 0x0f, 0xa2, 0x94, 0x29, 0xb7, 0x1a, 0xee, 0xda, 0x9a, 0x2b, 0x1e, 0x4b,
0x9d, 0x51, 0x94, 0xec, 0xc8, 0xdb, 0xeb, 0x68, 0x43, 0xfb, 0xfa, 0x01, 0xe3, 0x1a, 0xb7, 0xd6,
0x75, 0x80, 0x9c, 0xc5, 0xcb, 0x3c, 0x1d, 0xfc, 0x30, 0xa9, 0xac, 0x3c, 0x97, 0x13, 0x7f, 0xc3,
0x75, 0xe0, 0xe8, 0xf2, 0x06, 0xd3, 0x26, 0xbf, 0x28, 0x2c, 0xc6, 0xb8, 0x06, 0xf3, 0x63, 0x03,
0x3c, 0x67, 0x13, 0xef, 0x03, 0x8f, 0x86, 0x6d, 0x53, 0x18, 0x3b, 0xb1, 0x31, 0xcc, 0xc4, 0xf1,
0x64, 0x1b, 0xf7, 0x46, 0x0d, 0xc9, 0x71, 0x15, 0x3e, 0x1c, 0x7b, 0xd9, 0xd3, 0xa5, 0xfc, 0x47,
0x5e, 0xb7, 0xd3, 0xd4, 0x74, 0x7a, 0x8a, 0xd9, 0x75, 0x52, 0x77, 0xb9, 0xb5, 0xc5, 0x75, 0x72,
0xb9, 0x5b, 0x3e, 0x7f, 0xbd, 0x6b, 0x1f, 0x6a, 0x95, 0xa2, 0xe9, 0x7a, 0x10, 0xc9, 0xcc, 0xa6,
0x3f, 0xab, 0x68, 0xf5, 0x6b, 0x17, 0xb5, 0xdb, 0xfc, 0x7f, 0x3b, 0xa7, 0x22, 0xaa, 0x4f, 0x9c,
0xe6, 0x6d, 0x5b, 0x05, 0x7c, 0xb9, 0x63, 0xfc, 0x93, 0x3f, 0xe7, 0x2d, 0xad, 0x07, 0x05, 0x8c,
0x58, 0x77, 0x7e, 0xbf, 0x9f, 0x09, 0x35, 0x0c, 0x50, 0x63, 0xb2, 0x6c, 0x3d, 0x58, 0x76, 0x64,
0xbb, 0xcb, 0x32, 0x9c, 0xf1, 0xed, 0x09, 0x90, 0x9f, 0xc6, 0x51, 0xa7, 0xc4, 0x71, 0x17, 0x7b,
0x4f, 0x04, 0x56, 0xd0, 0x9f, 0x2b, 0xf0, 0xcb, 0x55, 0x96, 0xda, 0x28, 0xe2, 0x1b, 0x52, 0xa0,
0x6b, 0xaa, 0x9d, 0x81, 0x08, 0x5e, 0x4e, 0x55, 0x6b, 0xd7, 0x8b, 0xdc, 0xf6, 0x21, 0xb6, 0x9a,
0x66, 0xb6, 0x83, 0xdb, 0xde, 0x06, 0xb1, 0xf6, 0x76, 0x8a, 0x86, 0x60, 0xf5, 0x86, 0xe5, 0x2d,
0xac, 0xb2, 0xf3, 0x0b, 0x76, 0x97, 0xa8, 0xb1, 0x20, 0x2e, 0x40, 0x81, 0x3f, 0xb8, 0xd5, 0x9e,
0xfc, 0x96, 0xa5, 0xf1, 0x02, 0x00, 0x08, 0x25, 0xf4, 0x90, 0x6d, 0x45, 0xb0, 0x22, 0xd2, 0x11,
0x0c, 0x98, 0xb4, 0x52, 0xe0, 0xe7, 0x1a, 0xe1, 0xa7, 0x58, 0xa5, 0xbb, 0x1b, 0x46, 0xd3, 0x0b,
0x50, 0xa0, 0x81, 0xbc, 0x98, 0x36, 0x86, 0x0b, 0xc4, 0x23, 0x9a, 0x6c, 0xd2, 0xe5, 0x67, 0xbf,
0x7d, 0x46, 0x96, 0xa3, 0x4b, 0x58, 0x94, 0x4d, 0xf0, 0xc8, 0xe2, 0x2f, 0x3a, 0xa3, 0x1d, 0xa7,
0x32, 0x9e, 0x32, 0x0c, 0x2f, 0xa1, 0xa1, 0x8d, 0x9e, 0x64, 0x56, 0xd0, 0x36, 0x48, 0x38, 0x6c,
0x64, 0x41, 0xf5, 0x54, 0xe5, 0x21, 0x5c, 0x39, 0x8d, 0xd0, 0x20, 0xe1, 0xa4, 0xe7, 0xc2, 0x20,
0x38, 0x69, 0xd0, 0xb8, 0xe2, 0x34, 0xcc, 0x70, 0xcf, 0x13, 0x8d, 0xea, 0x3d, 0x62, 0x93, 0x0d,
0x06, 0x4e, 0x5f, 0x2c, 0x70, 0x60, 0xd5, 0x1e, 0x40, 0xa2, 0xa8, 0x2e, 0xe9, 0x90, 0xfd, 0xfb,
0x1f, 0xcb, 0x80, 0x11, 0xd0, 0x1a, 0xa5, 0x29, 0xe6, 0x08, 0xa7, 0x5f, 0x16, 0x72, 0x12, 0xd2,
0x6e, 0xbc, 0x95, 0xc9, 0x0d, 0xc3, 0x4b, 0x54, 0x9e, 0xd6, 0xe8, 0xe5, 0x33, 0x4d, 0xc4, 0x6f,
0x49, 0xcd, 0xc7, 0x08, 0x6b, 0x62, 0x43, 0xd8, 0x44, 0x6f, 0x93, 0xae, 0xd8, 0x2f, 0xaf, 0x6a,
0xfe, 0x94, 0x57, 0xee, 0x70, 0x56, 0x32, 0xaf, 0x01, 0xf9, 0x74, 0x5a, 0xf0, 0xdb, 0x44, 0x59,
0x9a, 0x53, 0xa6, 0x7a, 0x84, 0xa2, 0xa1, 0x0d, 0x33, 0xd0, 0x12, 0x47, 0x49, 0x6c, 0xb6, 0x93,
0xb0, 0x36, 0x8f, 0x6c, 0xbc, 0xc4, 0xd9, 0x46, 0xbc, 0xa6, 0x49, 0xfe, 0xe8, 0x75, 0xa7, 0x65,
0x10, 0xdb, 0xfa, 0xa6, 0x68, 0x3d, 0x51, 0x28, 0xb8, 0x31, 0xc5, 0x30, 0x6e, 0x64, 0xf1, 0xaa,
0xcc, 0xba, 0x14, 0x41, 0x6f, 0xb7, 0x0e, 0xc2, 0x4b, 0xac, 0x5b, 0xfb, 0x7e, 0xd2, 0xf7, 0x4a,
0xdf, 0x4f, 0xf6, 0x5e, 0xd9, 0xfb, 0x99, 0xfc, 0x6f, 0x4d, 0x4a, 0xf1, 0xcc, 0xde, 0x0b, 0x29,
0x18, 0xa1, 0xe5, 0xf2, 0xc3, 0xc4, 0x7c, 0xbd, 0x26, 0xf3, 0x6b, 0x24, 0x1a, 0x32, 0xaa, 0x10,
0x03, 0x61, 0x6f, 0x38, 0x2d, 0xed, 0xa2, 0x0c, 0x52, 0x4f, 0x8d, 0x00, 0x79, 0xd7, 0x35, 0x85,
0xdb, 0xd1, 0x49, 0x33, 0xdd, 0x80, 0x99, 0x33, 0x8b, 0xed, 0x32, 0xec, 0xc6, 0x22, 0xf1, 0xe0,
0x4e, 0xfe, 0x5c, 0x24, 0xae, 0x50, 0xfa, 0x75, 0xdb, 0xf7, 0x1a, 0xf6, 0x91, 0x1b, 0xe3, 0x02,
0xd5, 0x1c, 0xee, 0xde, 0x43, 0xe2, 0xac, 0xaa, 0xef, 0xd4, 0x68, 0x0a, 0xd0, 0x87, 0xcf, 0xce,
0xe4, 0xbc, 0x41, 0x04, 0x5e, 0x8a, 0xcd, 0xc9, 0x3e, 0x1e, 0x04, 0x94, 0xcd, 0x91, 0x44, 0x5d,
0x21, 0x59, 0x0b, 0x82, 0xc2, 0xec, 0x8f, 0x09, 0x3e, 0x58, 0xb5, 0xeb, 0xb7, 0xd5, 0x75, 0xeb,
0x8e, 0x68, 0x16, 0x04, 0x5d, 0xee, 0xe6, 0x20, 0x7a, 0xa5, 0x25, 0x95, 0x4a, 0xd1, 0xa0, 0x45,
0x48, 0xd8, 0xad, 0x14, 0x24, 0xa3, 0x9e, 0x1c, 0x25, 0x62, 0x4f, 0x1a, 0x43, 0x9d, 0x58, 0x3b,
0xdf, 0x07, 0xd8, 0xf6, 0x1d, 0x2c, 0x58, 0xcc, 0xf0, 0xe5, 0x91, 0x3c, 0xdf, 0x73, 0x30, 0xbb,
0x0a, 0x5b, 0x1c, 0x48, 0xb3, 0x23, 0x74, 0x52, 0xde, 0x9c, 0xfa, 0x16, 0xe2, 0xd0, 0x25, 0xf2,
0xf7, 0x76, 0xe2, 0x0e, 0x34, 0xe4, 0x5f, 0xef, 0x91, 0xe3, 0x1c, 0xb7, 0x79, 0xc8, 0x95, 0x8c,
0x5a, 0x37, 0x37, 0x12, 0x90, 0xc7, 0x0a, 0xea, 0x27, 0xd3, 0x3e, 0x1c, 0x9e, 0x3f, 0x22, 0x66,
0x7d, 0x70, 0x2d, 0xef, 0xdb, 0x30, 0x3a, 0x57, 0x8d, 0x2a, 0x15, 0x39, 0xc1, 0x6d, 0x11, 0x77,
0xb8, 0xf7, 0xf9, 0x7a, 0x6c, 0x8a, 0xb4, 0xaa, 0xdc, 0xd3, 0xc7, 0x3d, 0x21, 0xeb, 0xe4, 0xa9,
0x57, 0x59, 0x86, 0x1f, 0x12, 0x39, 0x2e, 0xaf, 0x52, 0xcd, 0x89, 0x5d, 0xc4, 0x71, 0xf3, 0x3f,
0xf0, 0xce, 0xd6, 0x1f, 0x65, 0x69, 0x1e, 0x74, 0xf6, 0x94, 0xae, 0xe1, 0x9f, 0x4c, 0x66, 0x08,
0x0a, 0x82, 0x4b, 0x2d, 0xaa, 0x82, 0xad, 0x2b, 0x7c, 0x2a, 0xe1, 0xb4, 0x5a, 0x9d, 0xec, 0x28,
0x5a, 0xb9, 0x07, 0x03, 0x67, 0x2b, 0xcb, 0x19, 0xca, 0xee, 0xaa, 0xc4, 0x8f, 0x96, 0x8b, 0xfd,
0x34, 0x03, 0xbc, 0xf2, 0xea, 0xf7, 0xe3, 0x9f, 0xe8, 0x24, 0x4d, 0x32, 0xec, 0x79, 0xc8, 0x92,
0x58, 0xe1, 0xb9, 0xf7, 0x06, 0xb0, 0x9f, 0x62, 0x80, 0xda, 0x07, 0xc5, 0xf6, 0xee, 0xb9, 0xb9,
0x6a, 0x16, 0x1f, 0xbb, 0x52, 0x27, 0x30, 0x22, 0x02, 0xcc, 0xe2, 0x3e, 0xc9, 0x89, 0x5c, 0x3a,
0xf5, 0x23, 0x4d, 0xb8, 0x11, 0xf7, 0x0a, 0xbb, 0xf6, 0x5e, 0xb6, 0x75, 0x95, 0xf3, 0xae, 0x7c,
0xfb, 0x70, 0xfb, 0x65, 0xfa, 0x72, 0xba, 0x87, 0x83, 0xbb, 0x91, 0x48, 0xc6, 0x90, 0x48, 0x36,
0x72, 0x1b, 0x71, 0x0e, 0x41, 0x25, 0x8c, 0xee, 0x7e, 0x44, 0xce, 0x1a, 0xbf, 0x01, 0xcf, 0xe9,
0x70, 0xeb, 0xf8, 0xdc, 0xe0, 0xd6, 0xf9, 0xb7, 0xcb, 0xe4, 0xaf, 0x2e, 0x1c, 0xb3, 0x64, 0xc3,
0x56, 0x96, 0x94, 0xb9, 0xac, 0xd4, 0x55, 0xb9, 0x3d, 0x1b, 0x4e, 0x77, 0xcb, 0x7e, 0x39, 0xd5,
0x58, 0xad, 0xbd, 0x2f, 0x36, 0x09, 0x70, 0x3e, 0xd6, 0xea, 0xca, 0x10, 0x3a, 0x1c, 0xce, 0x37,
0xe9, 0x9f, 0x14, 0x52, 0xbc, 0xe3, 0xb4, 0x5f, 0x85, 0x04, 0x20, 0x54, 0xa8, 0x3d, 0x6b, 0xf8,
0x6a, 0x29, 0xcd, 0x9d, 0x62, 0x34, 0x04, 0x05, 0x7a, 0x5c, 0x87, 0x13, 0xb1, 0xd1, 0xb2, 0x23,
0x46, 0xb9, 0x4a, 0x8b, 0x96, 0x5d, 0x8f, 0x3b, 0xc2, 0xee, 0x6b, 0x5a, 0x9c, 0xa6, 0xce, 0x49,
0x98, 0x7d, 0xb2, 0xe0, 0x0c, 0x25, 0x69, 0xf0, 0xea, 0xf8, 0x31, 0x3d, 0x22, 0x00, 0xc7, 0xe0,
0x9e, 0xbc, 0xa0, 0x65, 0x95, 0x3a, 0x7c, 0x7c, 0x10, 0x19, 0x78, 0x64, 0x40, 0x33, 0xb4, 0x4c,
0xa5, 0x74, 0xeb, 0xeb, 0xde, 0x56, 0xd5, 0x28, 0xf6, 0x82, 0xef, 0x8c, 0x57, 0xd9, 0xfa, 0x52,
0xbf, 0xdf, 0x9e, 0x9d, 0x2d, 0xaf, 0xd1, 0x21, 0x99, 0x94, 0xa8, 0xbd, 0xfb, 0x68, 0x12, 0xd7,
0x72, 0xb8, 0x4c, 0x9e, 0x01, 0xeb, 0xf3, 0x2f, 0xe4, 0xd4, 0x66, 0xfd, 0xe9, 0xae, 0x4e, 0x0e,
0x77, 0x63, 0x54, 0xd2, 0x8e, 0x0d, 0xb1, 0xb6, 0x8d, 0x41, 0x9b, 0xfb, 0x74, 0x55, 0xba, 0xdd,
0x28, 0x92, 0x6b, 0x49, 0x2d, 0xc9, 0xdc, 0xa6, 0x38, 0xb6, 0xd3, 0x02, 0xef, 0x65, 0x34, 0x17,
0x81, 0xea, 0x34, 0xea, 0x46, 0x0d, 0xe9, 0x9e, 0xe4, 0xe1, 0x5c, 0x1f, 0x7c, 0x68, 0xbe, 0x00,
0x0c, 0x6a, 0x87, 0x5e, 0x2e, 0x29, 0x68, 0x65, 0xbd, 0x00, 0x85, 0x88, 0x41, 0xde, 0x81, 0x14,
0x63, 0xaf, 0x0d, 0x58, 0x00, 0x1a, 0x09, 0x91, 0xfd, 0x4a, 0xf7, 0xbc, 0x9c, 0xe2, 0xa1, 0x0a,
0xea, 0xe0, 0xf1, 0xf6, 0x6f, 0x24, 0x98, 0xc2, 0x4c, 0x34, 0x99, 0x5a, 0x2c, 0xc8, 0x4b, 0xe5,
0xa0, 0xf3, 0x39, 0xf6, 0x42, 0xb3, 0x0c, 0x5f, 0x90, 0x9e, 0xd7, 0x2c, 0x34, 0x8b, 0xdf, 0xcc,
0xc3, 0xc8, 0x25, 0x38, 0x2c, 0x5c, 0x4d, 0x81, 0xfa, 0x4b, 0x78, 0xad, 0x39, 0xc7, 0xb3, 0x3a,
0x74, 0x42, 0xe9, 0xd1, 0x68, 0x3b, 0x78, 0x0d, 0x6f, 0x54, 0x7b, 0xef, 0x39, 0x6c, 0x22, 0xf1,
0x84, 0x96, 0x3f, 0x71, 0x03, 0xd8, 0x9b, 0x8e, 0x67, 0xd7, 0xe9, 0xed, 0x03, 0x2c, 0x79, 0x54,
0x14, 0x77, 0x7d, 0x3b, 0x86, 0x3f, 0xb6, 0xe0, 0xd7, 0xb4, 0x00, 0xf9, 0x39, 0x02, 0x90, 0xdf,
0xd1, 0x01, 0xe4, 0x85, 0x1c, 0xcf, 0x5f, 0xfa, 0xf7, 0x5f, 0xdb, 0xf2, 0xdb, 0x4b, 0xa7, 0xb7,
0x2e, 0xac, 0xbe, 0xf5, 0x0b, 0xb6, 0xb7, 0x7e, 0x98, 0xae, 0xb7, 0xbe, 0xe7, 0xe7, 0x00, 0x4f,
0x11, 0x51, 0x16, 0x3d, 0xf2, 0x1e, 0x79, 0x29, 0xfd, 0xf7, 0xd2, 0x34, 0xbc, 0x06, 0xd5, 0xd3,
0xee, 0x81, 0x8c, 0x77, 0x74, 0x4d, 0xdf, 0xd6, 0x49, 0x11, 0x84, 0x35, 0x8c, 0xb2, 0x5e, 0xce,
0xd8, 0x7b, 0x62, 0x80, 0xb5, 0xa6, 0x48, 0x5e, 0x17, 0x8d, 0x69, 0xbf, 0x4f, 0x2f, 0xa4, 0x3b,
0xba, 0xc6, 0x5a, 0x46, 0x66, 0x87, 0xb8, 0xa2, 0xfb, 0xf8, 0x34, 0x2d, 0x7a, 0x8b, 0xb5, 0x2e,
0xc1, 0x04, 0x9c, 0xc4, 0xc8, 0x68, 0x76, 0x6c, 0xd5, 0x02, 0x6b, 0xa5, 0x07, 0x6b, 0x54, 0x12,
0xa7, 0xbe, 0x91, 0xa7, 0x3f, 0x77, 0x4b, 0xb9, 0xc9, 0x56, 0x0a, 0xba, 0xa6, 0x7e, 0x10, 0x78,
0x94, 0xf4, 0xb8, 0x02, 0x4d, 0x8f, 0xf3, 0x96, 0xb9, 0xc2, 0x6a, 0x4a, 0x0f, 0x4d, 0x42, 0x1c,
0x6d, 0x80, 0x0f, 0xa1, 0x76, 0x3b, 0xc4, 0x62, 0x2c, 0x06, 0xc3, 0x8b, 0x37, 0xa3, 0xf9, 0x46,
0xf7, 0xc3, 0x49, 0xd8, 0xee, 0x1f, 0xef, 0x81, 0x34, 0x40, 0x22, 0x5d, 0xe4, 0x8d, 0x09, 0x77,
0x4f, 0x1d, 0xb8, 0xc8, 0x9b, 0x00, 0x8b, 0xd9, 0x93, 0x55, 0x6c, 0x51, 0xbb, 0x3c, 0x35, 0xd5,
0xf8, 0xdc, 0x2f, 0x8f, 0x85, 0x33, 0x61, 0x5b, 0x04, 0x19, 0x17, 0x48, 0x26, 0x3d, 0xf4, 0x9d,
0x1d, 0x56, 0xe7, 0x09, 0x8b, 0xf8, 0x51, 0x99, 0x28, 0xcc, 0xce, 0x3d, 0x06,
0x1b, 0x10, 0x89, 0x44, 0x54, 0xd0, 0x32, 0x01, 0xeb, 0x01, 0xdb, 0x98, 0x0e, 0xf5, 0x17, 0x3a,
0xe5, 0xf6, 0x2d, 0x3d, 0x0e, 0x79, 0xd9, 0x46, 0xc2, 0x94, 0xf2, 0xdb, 0x17, 0xa8, 0xb5, 0x09,
0x39, 0x42, 0x63, 0x9f, 0xe4, 0xfa, 0xfe, 0x6c, 0x55, 0x5f, 0xd3, 0x51, 0x52, 0x5d, 0x51, 0xad,
0x65, 0x21, 0x23, 0x96, 0x79, 0x10, 0x4e, 0x2c, 0xff, 0x44, 0x2c, 0x29, 0x25, 0x0d, 0x9b, 0x04,
0xf0, 0x52, 0x9c, 0x95, 0xe6, 0xac, 0xf9, 0xa6, 0x06, 0x9c, 0xa3, 0x28, 0x1a, 0xb7, 0xd8, 0x9d,
0x67, 0x74, 0x42, 0xfb, 0x66, 0x49, 0x6b, 0xeb, 0xce, 0x21, 0xfd, 0xf9, 0x6b, 0xd5, 0xd7, 0x6f,
0x9c, 0x72, 0x99, 0xbc, 0x26, 0x40, 0xcf, 0x71, 0xa1, 0x0f, 0xe7, 0xbc, 0xed, 0xde, 0x8b, 0xb2,
0x78, 0x68, 0x02, 0x43, 0x19, 0x03, 0x95, 0xc4, 0x11, 0x17, 0xf3, 0xff, 0xb5, 0xbe, 0xaf, 0x9a,
0xee, 0x5e, 0x26, 0x5e, 0x63, 0x04, 0xdf, 0x3f, 0x59, 0xb4, 0x3b, 0x11, 0xba, 0xb4, 0xae, 0x67,
0x9c, 0x7b, 0x4d, 0x02, 0x61, 0xd8, 0x96, 0xf8, 0xfe, 0x6a, 0xef, 0xaf, 0xb6, 0x62, 0xa4, 0x9a,
0x40, 0xc5, 0xc2, 0xbe, 0xba, 0x33, 0xb9, 0x58, 0x5b, 0x66, 0xfa, 0xa8, 0x7f, 0xe3, 0x7c, 0x4b,
0x6d, 0x56, 0xb5, 0x01, 0x1a, 0x65, 0x95, 0x8c, 0x61, 0x7d, 0xba, 0xf5, 0x41, 0x55, 0x05, 0xb0,
0x0e, 0x3f, 0xda, 0xff, 0xcf, 0x37, 0x2d, 0x37, 0x04, 0x87, 0xeb, 0x1c, 0xb3, 0x0d, 0x92, 0x4d,
0x82, 0xf5, 0x5c, 0x39, 0x1f, 0x4d, 0x14, 0xf7, 0x7f, 0xef, 0xbe, 0xaa, 0xc1, 0x37, 0xdd, 0x62,
0xff, 0xee, 0x86, 0xf0, 0x1b, 0x46, 0xf0, 0x1a, 0x82, 0xe6, 0x1c, 0xd0, 0xed, 0xfa, 0x7a, 0x55,
0xf5, 0x1b, 0x6d, 0x38, 0x3c, 0x40, 0x13, 0x1c, 0xd8, 0x75, 0x58, 0xe7, 0xb8, 0x1c, 0x59, 0x1b,
0x19, 0x1f, 0x84, 0x8a, 0x42, 0x9f, 0x66, 0xa4, 0x7c, 0xa8, 0x51, 0xa6, 0x50, 0x41, 0x26, 0x5b,
0x32, 0x76, 0xd8, 0x13, 0x6b, 0x6e, 0x66, 0xf2, 0xf0, 0xd9, 0x90, 0x9c, 0x6a, 0xc7, 0x74, 0x6c,
0x20, 0x1c, 0x90, 0x73, 0xa6, 0xdf, 0x45, 0x74, 0xd6, 0x38, 0xa0, 0x2d, 0x94, 0xf6, 0x9f, 0x38,
0x9e, 0xf2, 0x96, 0x25, 0x39, 0x09, 0xf8, 0xf6, 0x44, 0x5c, 0xae, 0xbd, 0xe3, 0xc7, 0x37, 0xc9,
0x68, 0x77, 0x16, 0x71, 0x00, 0x0f, 0xae, 0xec, 0x88, 0x4d, 0x34, 0x8e, 0x5e, 0x04, 0x95, 0xd2,
0x51, 0x88, 0x86, 0x01, 0xc8, 0x14, 0x6b, 0x29, 0xe7, 0x88, 0x89, 0xa9, 0xa2, 0x48, 0xae, 0xa2,
0xe1, 0xa3, 0x09, 0x93, 0x65, 0x55, 0xd4, 0x18, 0xc7, 0xe7, 0x74, 0xa6, 0xcd, 0x47, 0xb0, 0x5f,
0x1c, 0x43, 0x43, 0xf3, 0xc6, 0x34, 0xb1, 0x31, 0xc9, 0xf6, 0x6c, 0xd2, 0xcb, 0x59, 0x8e, 0xaf,
0xed, 0xb5, 0x29, 0xc4, 0xd2, 0xe0, 0x85, 0x90, 0x12, 0xbf, 0x5b, 0x36, 0xb8, 0xf4, 0x6a, 0x2a,
0xb7, 0xfb, 0xaf, 0x9b, 0x13, 0x16, 0x97, 0x98, 0x38, 0xdb, 0x95, 0x0f, 0xff, 0xe9, 0x67, 0xaf,
0xbe, 0x67, 0xeb, 0x73, 0xe3, 0xc4, 0xc5, 0xb5, 0x95, 0xb5, 0xa9, 0xe3, 0x5b, 0x3d, 0xab, 0xe3,
0xf6, 0xe9, 0x43, 0x1d, 0x02, 0x3c, 0xb9, 0x80, 0x59, 0x59, 0x85, 0x24, 0x09, 0xb7, 0x3a, 0x64,
0xc7, 0x9d, 0x57, 0x8d, 0x92, 0xea, 0x59, 0xce, 0x6d, 0x4a, 0x05, 0x39, 0x0b, 0x3f, 0x1e, 0xa4,
0x3a, 0xba, 0x3c, 0x47, 0xdc, 0xb2, 0x80, 0xb6, 0xd2, 0x31, 0xb0, 0x21, 0x2b, 0xeb, 0x1c, 0xbd,
0xef, 0xdd, 0xe0, 0x40, 0xc4, 0x89, 0xfe, 0xa0, 0xb1, 0x22, 0x0a, 0xd5, 0xe5, 0x86, 0xce, 0x2b,
0xd8, 0xda, 0xb3, 0xa4, 0x47, 0xcd, 0xda, 0x3b, 0x6b, 0x13, 0x99, 0x3e, 0x34, 0x65, 0x4e, 0x31,
0x4c, 0x83, 0x50, 0x4c, 0xd2, 0x56, 0xa5, 0x0f, 0x37, 0x03, 0x42, 0x8b, 0xe0, 0xae, 0x00, 0x80,
0x03, 0x32, 0xac, 0x1b, 0xf2, 0x9c, 0x9b, 0x13, 0xb3, 0x63, 0x06, 0x7c, 0x4d, 0x75, 0x1e, 0x66,
0x82, 0xd4, 0xcd, 0xed, 0x80, 0x71, 0x8f, 0xe9, 0x3f, 0x3c, 0xac, 0xc3, 0xf9, 0x64, 0xfb, 0x42,
0x63, 0xda, 0x22, 0x07, 0x26, 0xe7, 0xf8, 0x88, 0x0f, 0x9f, 0xd6, 0x90, 0x11, 0x21, 0xd0, 0x97,
0x97, 0xaa, 0x82, 0x02, 0xcf, 0x9f, 0xdd, 0x50, 0xa8, 0x2e, 0x63, 0x88, 0xa5, 0x02, 0x07, 0xa8,
0xca, 0x7f, 0x6c, 0x9b, 0xd4, 0xd6, 0x2c, 0x07, 0x07, 0xb1, 0x7a, 0xf5, 0x31, 0xa6, 0x39, 0x2f,
0x8c, 0xde, 0x8a, 0x6c, 0xcc, 0x46, 0x93, 0x4f, 0xea, 0x7f, 0xa8, 0x5d, 0x3f, 0x73, 0x30, 0x46,
0xae, 0x32, 0x63, 0xa7, 0x52, 0x63, 0xf6, 0x8c, 0x5d, 0x14, 0x25, 0x27, 0x3e, 0xcf, 0x09, 0x9f,
0x75, 0x2a, 0x4f, 0x2e, 0xa8, 0x08, 0x75, 0xdb, 0xce, 0x17, 0x76, 0x70, 0x47, 0x68, 0x3c, 0xaa,
0xad, 0x06, 0x94, 0xca, 0x2a, 0x6a, 0x33, 0xe7, 0x6b, 0x5f, 0x37, 0x6b, 0xe5, 0xd4, 0x07, 0x38,
0x99, 0x77, 0x69, 0xed, 0xb1, 0x86, 0xcf, 0x99, 0xe5, 0x75, 0x30, 0x4b, 0x2a, 0x79, 0x36, 0x15,
0xc6, 0x2c, 0x99, 0x8e, 0x22, 0x94, 0xfe, 0x22, 0x54, 0xd9, 0xb1, 0x93, 0xfd, 0x0e, 0xee, 0x11,
0x68, 0x87, 0x12, 0xc3, 0xd8, 0xf8, 0x8d, 0xd7, 0x1e, 0x3c, 0xd4, 0x01, 0xa9, 0xaf, 0xcb, 0x77,
0x6b, 0x39, 0x21, 0xae, 0x0a, 0x07, 0x9a, 0x70, 0xca, 0x93, 0xb7, 0x59, 0xd0, 0x28, 0xa1, 0x98,
0x7f, 0x91, 0xea, 0x5c, 0xe3, 0x29, 0xac, 0xe2, 0x9b, 0x5b, 0xb7, 0x91, 0x5d, 0x9f, 0x9e, 0x3b,
0x85, 0xd1, 0x29, 0xbe, 0xed, 0xef, 0x73, 0x1b, 0xda, 0x82, 0xb0, 0xcd, 0x5a, 0x1c, 0xff, 0xb5,
0x19, 0x46, 0xe8, 0xf2, 0xc5, 0x59, 0x38, 0x89, 0x79, 0xdc, 0xe0, 0xc7, 0xf6, 0xd6, 0x4d, 0x4f,
0x2b, 0x35, 0x26, 0x8e, 0x4d, 0xf3, 0x1d, 0xc5, 0x82, 0xa9, 0xb9, 0x23, 0x62, 0x18, 0xa3, 0xab,
0x67, 0x1b, 0x0c, 0x56, 0x61, 0x4e, 0xfd, 0xb9, 0xf7, 0xde, 0x45, 0x24, 0x28, 0xa4, 0x20, 0xcb,
0x7b, 0xec, 0x91, 0x89, 0x4f, 0x74, 0x43, 0x7e, 0xca, 0xaf, 0x7d, 0xa5, 0xd6, 0x13, 0x66, 0x01,
0xa4, 0x35, 0x8c, 0x36, 0x0b, 0x7c, 0xf3, 0xbd, 0xe2, 0xdf, 0xfa, 0xee, 0x36, 0xf6, 0x2b, 0x2a,
0xd0, 0x66, 0x9e, 0x06, 0x7c, 0xa5, 0x2d, 0x91, 0x6f, 0xad, 0xd1, 0x7a, 0x4d, 0x9f, 0x58, 0xa6,
0x2e, 0x20, 0xf8, 0x3a, 0xee, 0x46, 0x28, 0x91, 0x89, 0xd0, 0xfc, 0xb1, 0x83, 0x55, 0x5d, 0x6e,
0x4f, 0x18, 0x4c, 0x61, 0xc3, 0x88, 0xb9, 0x48, 0x91, 0x90, 0x91, 0xe6, 0x44, 0x0c, 0x88, 0x7d,
0x07, 0xfc, 0x20, 0x97, 0x25, 0x0e, 0x74, 0x7c, 0x00, 0x17, 0x07, 0x5b, 0x96, 0x50, 0x16, 0x39,
0xd8, 0x4d, 0x6b, 0xc3, 0xb8, 0x78, 0xbf, 0x66, 0x38, 0x96, 0x55, 0x33, 0xcb, 0x49, 0x17, 0x28,
0x97, 0x9c, 0x59, 0x58, 0xc1, 0x46, 0x1a, 0x65, 0x0a, 0xb9, 0x40, 0x78, 0x47, 0x55, 0x6a, 0x2f,
0x76, 0x17, 0xe8, 0x30, 0x85, 0x99, 0x0d, 0x85, 0x25, 0x1d, 0x40, 0x7d, 0x2e, 0x28, 0xd6, 0x7a,
0xce, 0x83, 0x87, 0x15, 0x44, 0x1e, 0x48, 0x3d, 0x2d, 0x9e, 0xed, 0x3a, 0xca, 0x7e, 0x9d, 0x7e,
0xc5, 0x19, 0xa2, 0x62, 0x78, 0x2c, 0x8b, 0x79, 0xc9, 0xc3, 0xab, 0x4e, 0xc3, 0x0b, 0x27, 0x65,
0x98, 0xbc, 0xdc, 0xe6, 0x4e, 0x65, 0x2f, 0xb7, 0xab, 0x5a, 0xaa, 0xbb, 0x5c, 0x32, 0x1d, 0x94,
0x18, 0x01, 0x0e, 0x97, 0x0b, 0x51, 0x5f, 0xc8, 0xe5, 0x8f, 0x6a, 0xfb, 0x78, 0x5e, 0x14, 0x57,
0xc1, 0xf9, 0x56, 0x4e, 0x23, 0x58, 0x88, 0x2b, 0x55, 0x33, 0xfb, 0x0f, 0x68, 0xcc, 0x44, 0x39,
0x19, 0x14, 0x8f, 0x10, 0xe3, 0x24, 0x21, 0xe2, 0xf7, 0x37, 0xf9, 0x65, 0x30, 0x75, 0x04, 0x9a,
0xdc, 0x9f, 0xe9, 0x96, 0x6f, 0x5a, 0x6f, 0xce, 0x76, 0xfb, 0xc8, 0x9f, 0xa7, 0x47, 0xae, 0xc5,
0xc3, 0xea, 0xf3, 0xa3, 0xe5, 0x09, 0x0d, 0x3e, 0xde, 0xfe, 0xfb, 0xa1, 0xec, 0x7e, 0x27, 0x1e,
0x36, 0x56, 0xae, 0x84, 0x0a, 0x1f, 0x2f, 0xff, 0x3e, 0x8c, 0xf8, 0x50, 0x13, 0x2b, 0xef, 0x3f,
0x48, 0x81, 0xa6, 0x10, 0x26, 0x77, 0x8d, 0x1e, 0x9e, 0x30, 0xaa, 0x00, 0x66, 0x77, 0x6a, 0xe4,
0xe1, 0x97, 0x32, 0x65, 0x06, 0x03, 0xb2, 0x9f, 0x5d, 0x4b, 0xd0, 0xce, 0x0f, 0xa4, 0xfc, 0xae,
0xaf, 0x55, 0x14, 0x6b, 0xd7, 0x07, 0xd2, 0xad, 0xca, 0xdd, 0x1b, 0x21, 0xc3, 0x79, 0xf6, 0x38,
0x7d, 0x9d, 0xe8, 0x40, 0xb2, 0x21, 0xd2, 0xe7, 0x74, 0xfb, 0x5f, 0x8e, 0x9c, 0x01, 0xe9, 0xdd,
0x58, 0x35, 0x49, 0xaf, 0x69, 0xd1, 0xc7, 0x4f, 0x67, 0x3a, 0xd9, 0x82, 0xd8, 0xe2, 0xfe, 0xbc,
0x4c, 0xc1, 0x69, 0x3a, 0x97, 0xcd, 0xa2, 0xdf, 0x6f, 0xbb, 0x83, 0xd4, 0x13, 0x15, 0x33, 0x25,
0x5f, 0xdc, 0xba, 0xbb, 0x16, 0x30, 0x77, 0xaf, 0xa5, 0xb5, 0x2c, 0x10, 0x0b, 0xb6, 0xa7, 0x6e,
0x3a, 0xf2, 0xf5, 0xec, 0xda, 0xdf, 0x0f, 0x27, 0x2f, 0x95, 0x78, 0xad, 0x76, 0x4e, 0xda, 0x6d,
0x1d, 0xff, 0x40, 0x1d, 0x3c, 0xe7, 0x68, 0x64, 0xef, 0xef, 0xad, 0xbd, 0x29, 0xca, 0x29, 0xd4,
0x15, 0xd6, 0x60, 0x71, 0xd8, 0xec, 0x5b, 0x0e, 0xa8, 0x4e, 0x1b, 0x48, 0x2b, 0x9b, 0xf6, 0xc9,
0x37, 0x28, 0xfe, 0x6b, 0x41, 0x4d, 0xe8, 0x3f, 0x8d, 0x14, 0x3d, 0x6d, 0xeb, 0x8b, 0x90, 0xb3,
0x2e, 0x83, 0x7e, 0x75, 0x7e, 0x60, 0x47, 0xd0, 0xc7, 0xf4, 0x68, 0x88, 0xf4, 0xb0, 0x44, 0x21,
0x1d, 0xa5, 0xbe, 0x38, 0xf5, 0x9b, 0xb2, 0xa4, 0x33, 0xde, 0x2d, 0x1c, 0x54, 0xc8, 0x6c, 0xd5,
0x74, 0x6a, 0x76, 0x5b, 0x00, 0xb9, 0xdb, 0xe9, 0xfd, 0xfb, 0xdf, 0xe8, 0xab, 0x4e, 0x9c, 0xc6,
0x77, 0xfe, 0xcd, 0x8e, 0x29, 0x06, 0x81, 0x22, 0x09, 0xc3, 0x10, 0x33, 0x30, 0xa2, 0xc3, 0x82,
0x5e, 0xfb, 0x8f, 0xf6, 0x28, 0x20, 0xb3, 0x04, 0xe1, 0x8a, 0x25, 0xc0, 0x43, 0x63, 0x83, 0xcc,
0xca, 0xd9, 0x72, 0x7d, 0xbc, 0x68, 0xc7, 0xce, 0xfa, 0xc6, 0xc8, 0x0b, 0xe1, 0xb8, 0x76, 0xe9,
0x92, 0x35, 0xb6, 0x22, 0xe5, 0x4b, 0xc8, 0x66, 0xcf, 0xcf, 0xa7, 0xfe, 0x7a, 0x19, 0xff, 0x7e,
0xa9, 0xb3, 0x3b, 0xd0, 0x20, 0x7f, 0xa3, 0x1b, 0x1b, 0xba, 0x13, 0xa1, 0x04, 0x7d, 0x9f, 0x81,
0xbd, 0xf0, 0x17, 0xda, 0x95, 0x82, 0x7b, 0x6c, 0x6a, 0xa0, 0x34, 0x46, 0x6f, 0x30, 0x5e, 0x43,
0xf6, 0xff, 0x1d, 0x58, 0xbd, 0xae, 0xdd, 0x2f, 0xc6, 0xfb, 0x80, 0xcb, 0xe3, 0xb7, 0x79, 0xb4,
0xd9, 0x36, 0x47, 0x0a, 0x30, 0x58, 0x96, 0xd5, 0x6c, 0xfd, 0x35, 0x9d, 0x47, 0x54, 0xd5, 0x0f,
0x0f, 0x07, 0x85, 0xcc, 0xdd, 0x6f, 0xea, 0x30, 0xef, 0x60, 0x02, 0x3e, 0x77, 0x19, 0x82, 0x44,
0x8f, 0x93, 0xbe, 0x77, 0xf3, 0x27, 0x42, 0x43, 0xbb, 0xec, 0xf0, 0x54, 0x9c, 0x84, 0xb1, 0xf2,
0xa1, 0xfc, 0xe9, 0x22, 0xa3, 0x46, 0x36, 0xa6, 0x42, 0x96, 0xc8, 0x28, 0x6e, 0xe7, 0x67, 0x75,
0xe4, 0x11, 0xe2, 0x8a, 0x29, 0x41, 0xa8, 0x35, 0x9a, 0xcd, 0x31, 0xca, 0x6c, 0x91, 0x0d, 0x8b,
0x2f, 0xb4, 0x3e, 0x3e, 0x08, 0xd1, 0x25, 0x15, 0xd6, 0x1a, 0xe2, 0x5b, 0xf2, 0xa6, 0xd3, 0xcb,
0xb6, 0x8e, 0x59, 0xac, 0x2f, 0x9e, 0x94, 0xdc, 0x8a, 0xd8, 0xf3, 0x96, 0x2e, 0xd7, 0x56, 0xda,
0x1f, 0xb6, 0xcd, 0xf6, 0xe2, 0xed, 0x3b, 0x94, 0x21, 0x6e, 0xbd, 0xe2, 0x34, 0x4e, 0x74, 0x24,
0x82, 0xc8, 0xdd, 0x5b, 0xde, 0xfe, 0xef, 0x88, 0x88, 0xb9, 0x32, 0xa8, 0x8a, 0xf4, 0x6b, 0xf3,
0xe2, 0xf5, 0x58, 0x23, 0x07, 0x10, 0xbd, 0xb7, 0xc8, 0xee, 0x34, 0xdc, 0x2b, 0x7e, 0x71, 0x8f,
0x3f, 0x2d, 0x57, 0x3b, 0x00, 0xe8, 0xad, 0x7c, 0xb1, 0xf9, 0x94, 0x77, 0x05, 0xb9, 0xf1, 0x15,
0xa8, 0x83, 0x71, 0xa5, 0xac, 0x2b, 0x5e, 0x33, 0x4a, 0x7f, 0xae, 0x64, 0x8d, 0x03, 0x8c, 0xea,
0x4d, 0xb1, 0x2e, 0x92, 0x6b, 0x93, 0xd6, 0x4e, 0x3b, 0x0e, 0x5f, 0x70, 0xe9, 0xb8, 0x32, 0xf2,
0xb6, 0x39, 0x3e, 0xbf, 0x1f, 0x83, 0x5e, 0xdb, 0xfb, 0xcf, 0x83, 0xc5, 0x6f, 0x68, 0x7e, 0x7a,
0xdf, 0x9f, 0xb7, 0x6d, 0xde, 0x7b, 0xc4, 0xe3, 0x70, 0x82, 0xde, 0xa7, 0xfa, 0xfa, 0xb2, 0xed,
0xcd, 0x27, 0x52, 0xae, 0x7d, 0x87, 0xee, 0xa7, 0xfa, 0x4e, 0xfb, 0xbf, 0x31, 0xb0, 0xcf, 0x33,
0xd7, 0xc7, 0xf1, 0xa4, 0x35, 0x3f, 0xd5, 0xff, 0x8e, 0x4e, 0x95, 0x83, 0xd2, 0x48, 0xf2, 0xb7,
0xce, 0xec, 0x4e, 0x3e, 0xdf, 0x3c, 0xb8, 0x7f, 0xcb, 0x8d, 0x02, 0x72, 0x4f, 0xbe, 0xc6, 0xe6,
0x2b, 0x9b, 0x9a, 0xdd, 0x3a, 0xb7, 0xb1, 0xac, 0xe5, 0x3d, 0x55, 0xd9, 0x61, 0x07, 0x6d, 0xd5,
0x9a, 0x2e, 0xa7, 0x54, 0xa7, 0xc1, 0x06, 0x99, 0xc5, 0x00, 0x5f, 0xba, 0x14, 0xb6, 0x56, 0x1b,
0x66, 0xe5, 0x1a, 0xd6, 0xd3, 0xce, 0x92, 0x7c, 0x10, 0xe3, 0xca, 0x73, 0x1e, 0x70, 0xd9, 0xfc,
0x8b, 0x4d, 0x17, 0xf2, 0xc4, 0x98, 0x08, 0x53, 0xc1, 0x23, 0xfe, 0x3d, 0x0c, 0x57, 0xf2, 0xb5,
0xdb, 0xc3, 0xf5, 0x42, 0x5b, 0xda, 0xcd, 0x51, 0xbd, 0x9f, 0xac, 0x38, 0x2c, 0x53, 0x47, 0x3f,
0x4b, 0x1d, 0x11, 0x8a, 0xa9, 0xa3, 0x4e, 0xbf, 0xfb, 0xd8, 0xe7, 0xb4, 0x18, 0xce, 0x69, 0xaf,
0x0e, 0xa9, 0xda, 0xce, 0x3d, 0x31, 0xdd, 0x04, 0x06, 0x75, 0x58, 0x7b, 0x03, 0xd3, 0xa6, 0x77,
0x02, 0x80, 0x4e, 0x0a, 0x80, 0xe0, 0x19, 0x8d, 0xb2, 0x63, 0x27, 0x06, 0x1d, 0x48, 0x73, 0xf8,
0xb8, 0x75, 0xd8, 0x2d, 0xb5, 0xfc, 0xac, 0xf6, 0x4f, 0xab, 0xa8, 0xfc, 0xca, 0xae, 0xc7, 0xcf,
0x2c, 0x40, 0x39, 0x50, 0x1e, 0xf7, 0x16, 0x9f, 0xbc, 0x75, 0xc6, 0xc1, 0xe2, 0x6a, 0xdc, 0xd9,
0x73, 0x4f, 0xa4, 0x01, 0xee, 0x02, 0xc5, 0x0c, 0x18, 0x96, 0xc9, 0x1f, 0x8f, 0x49, 0x5f, 0xc0,
0xe7, 0x00, 0xd4, 0x71, 0x0f, 0xe1, 0xf6, 0xc2, 0x63, 0x11, 0x7e, 0xe4, 0xb0, 0x89, 0x7c, 0xd5,
0x15, 0xa8, 0x97, 0xb9, 0x76, 0xcc, 0xd2, 0x54, 0x73, 0x3a, 0xa6, 0xdf, 0x91, 0x97, 0xee, 0xcc,
0xf9, 0x1e, 0x3a, 0x53, 0xc4, 0x44, 0x76, 0x91, 0xf2, 0x9d, 0x46, 0x2a, 0x40, 0x68, 0x8b, 0x67,
0x3b, 0x50, 0x6f, 0x6d, 0x69, 0x0b, 0x4c, 0x69, 0x15, 0x7d, 0xe3, 0xd1, 0x44, 0x3a, 0x33, 0x59,
0x71, 0xe8, 0x1c, 0xca, 0x4b, 0x42, 0xeb, 0x24, 0x43, 0x93, 0xc1, 0xd6, 0x16, 0xd6, 0x46, 0xbf,
0x93, 0x74, 0x85, 0x73, 0x4f, 0xb5, 0x55, 0x36, 0x60, 0x04, 0x77, 0x0d, 0xd7, 0xb6, 0xec, 0x00,
0x15, 0x4f, 0x5a, 0x97, 0xab, 0x6b, 0xc6, 0x9c, 0x42, 0x0f, 0xa2, 0x51, 0x48, 0x1a, 0xf6, 0x15,
0xae, 0xe3, 0x84, 0x91, 0x4f, 0xfd, 0x0d, 0x65, 0x71, 0x9b, 0x2b, 0x24, 0x56, 0x6c, 0xb2, 0x73,
0x6c, 0xa8, 0x69, 0xdc, 0x9f, 0x04, 0x36, 0xf8, 0x63, 0x05, 0xc9, 0x4b, 0x3b, 0x45, 0xb5, 0x81,
0xa4, 0x7b, 0x32, 0x96, 0x2c, 0x43, 0x0f, 0x92, 0xd0, 0xb1, 0xe5, 0xc8, 0x90, 0x4b, 0xb2, 0x50,
0xb4, 0x2b, 0x6b, 0x74, 0x91, 0xdb, 0x16, 0x84, 0x05, 0x83, 0xef, 0x91, 0xb7, 0xb7, 0x79, 0x9f,
0x84, 0xcc, 0x67, 0x2d, 0xc7, 0x98, 0x6c, 0x61, 0xb0, 0xa7, 0x06, 0xca, 0xaa, 0xdb, 0xe1, 0xa1,
0x60, 0x25, 0x14, 0x1a, 0x5d, 0xd6, 0x38, 0x67, 0xdf, 0x1a, 0x07, 0x19, 0x32, 0x74, 0x7a, 0xc5,
0xe0, 0x32, 0x93, 0x09, 0xec, 0xf9, 0x3d, 0xdc, 0x65, 0xd4, 0x3a, 0x89, 0xd6, 0xab, 0x4d, 0x61,
0xf4, 0x53, 0x28, 0x65, 0xd9, 0xe4, 0xac, 0x8d, 0x85, 0x3d, 0x8b, 0x70, 0x49, 0x70, 0xf4, 0xaf,
0xa1, 0x4e, 0xa8, 0x1e, 0xe1, 0xf9, 0xe7, 0xd6, 0xb0, 0x07, 0x10, 0x71, 0xb0, 0x64, 0x0d, 0x99,
0x5a, 0x67, 0x15, 0xa7, 0x83, 0xd0, 0x61, 0x18, 0xd1, 0x26, 0x19, 0xd2, 0x49, 0x5c, 0x9f, 0x48,
0xd6, 0x7a, 0xe6, 0x27, 0x56, 0x6d, 0x2e, 0x26, 0x04, 0xff, 0x4d, 0x62, 0x2d, 0xb0, 0x4a, 0xf4,
0x43, 0xf1, 0x5b, 0x55, 0x02, 0x0f, 0xe0, 0xd3, 0xa0, 0x7d, 0xfa, 0xc5, 0xae, 0x8c, 0x03, 0xa9,
0x10, 0x30, 0x29, 0x84, 0xa7, 0x37, 0xf0, 0x76, 0x83, 0x71, 0xff, 0xab, 0xd8, 0x03, 0xa9, 0x4f,
0x05, 0xf0, 0xf7, 0x85, 0x6e, 0x8c, 0x22, 0x7e, 0xfa, 0x44, 0xb0, 0xfd, 0x91, 0xde, 0x68, 0x43,
0xac, 0xb5, 0x47, 0xe4, 0x8d, 0x9a, 0x1f, 0xd0, 0x4c, 0x77, 0xf1, 0x71, 0xcd, 0x77, 0xf9, 0x97,
0x18, 0xc7, 0x97, 0x15, 0x5b, 0x12, 0x69, 0x36, 0x9c, 0x20, 0x8c, 0x1d, 0x35, 0x1d, 0x65, 0xad,
0x8b, 0x44, 0x0c, 0x07, 0xda, 0x58, 0x42, 0x21, 0xbf, 0x18, 0x41, 0xa8, 0xd3, 0x7a, 0x4b, 0x4f,
0x54, 0x2c, 0xd5, 0x0d, 0xf8, 0xcd, 0x24, 0xf8, 0x2c, 0x79, 0x65, 0xca, 0x2a, 0xf3, 0xbb, 0x87,
0x2c, 0xa3, 0x44, 0x60, 0xbe, 0x9b, 0xe4, 0x41, 0xde, 0xde, 0x48, 0x63, 0x11, 0xaf, 0x20, 0x0a,
0x92, 0xea, 0x52, 0x89, 0x57, 0x1c, 0xad, 0x4c, 0xc2, 0xe1, 0x39, 0x33, 0x95, 0x4d, 0xe2, 0xce,
0xaf, 0xe6, 0x16, 0xd5, 0x77, 0x57, 0x0a, 0x0c, 0x1b, 0x72, 0x8f, 0x10, 0xc3, 0x22, 0x24, 0x6f,
0x87, 0x15, 0x2e, 0xf9, 0x4b, 0x01, 0x21, 0x41, 0x31, 0x28, 0x94, 0xc3, 0x9a, 0x14, 0xb3, 0x1a,
0x3a, 0x15, 0x09, 0xa7, 0x43, 0xac, 0x16, 0x98, 0x53, 0x4a, 0x2d, 0xd8, 0xc0, 0x6a, 0xda, 0xcb,
0x1e, 0xa9, 0xda, 0xc7, 0xc4, 0x30, 0xe8, 0xf5, 0x14, 0x45, 0x99, 0x92, 0x43, 0x4b, 0x97, 0xc8,
0x16, 0x1d, 0x4b, 0x9d, 0x18, 0x6a, 0xa9, 0x58, 0x10, 0xec, 0x75, 0x37, 0xf2, 0x9a, 0xb9, 0x8c,
0xa3, 0x03, 0xe9, 0x7b, 0xdd, 0xa4, 0xe4, 0xd0, 0x62, 0x53, 0x64, 0x33, 0x2d, 0x22, 0xbb, 0x06,
0x3c, 0x03, 0x52, 0x99, 0x09, 0x18, 0xb1, 0x85, 0x62, 0xdf, 0xc9, 0x25, 0x8e, 0x0f, 0x00, 0x7e,
0x34, 0x8f, 0xa3, 0xa1, 0xa0, 0x65, 0x64, 0x91, 0xfb, 0xbf, 0x20, 0xf2, 0xc9, 0xa8, 0xe5, 0xdc,
0xa9, 0x36, 0xa0, 0x54, 0x68, 0x03, 0xe8, 0x81, 0x90, 0xc9, 0x33, 0x0a, 0x89, 0xa1, 0x01, 0x4a,
0xdc, 0x55, 0x31, 0x06, 0x87, 0x0c, 0xf0, 0x9a, 0xa4, 0x07, 0x6b, 0xa6, 0x00, 0xfe, 0x84, 0xb8,
0x13, 0xdf, 0xe4, 0xc2, 0x5a, 0x20, 0xa3, 0x38, 0x5a, 0xdc, 0xe3, 0x3c, 0x33, 0xdb, 0xef, 0x81,
0x05, 0xbd, 0x76, 0x0d, 0x2f, 0x29, 0xbf, 0x86, 0xaa, 0x90, 0x7a, 0x74, 0x2e, 0x91, 0x2a, 0xda,
0x22, 0x98, 0x16, 0x50, 0x9e, 0xf3, 0x32, 0x0c, 0x3a, 0x48, 0x47, 0x1e, 0xec, 0x6b, 0x63, 0xf2,
0xe7, 0x87, 0x31, 0xd2, 0xd8, 0x8e, 0xa1, 0xa1, 0xd5, 0x62, 0x91, 0xc6, 0x03, 0x5f, 0x4e, 0xe2,
0x14, 0xad, 0x03, 0x31, 0xd3, 0x39, 0x45, 0x31, 0xf3, 0x2b, 0x27, 0x97, 0x7a, 0x4f, 0x4a, 0xc2,
0xc6, 0xce, 0xd4, 0xe8, 0x37, 0x55, 0xc8, 0x30, 0x67, 0x5b, 0xe4, 0x19, 0x68, 0x9b, 0xd8, 0x8f,
0x71, 0xb5, 0x0f, 0x6b, 0xa8, 0x58, 0x2d, 0xed, 0x52, 0xc0, 0xc6, 0x73, 0x10, 0xba, 0xc6, 0x14,
0x5d, 0x9c, 0x78, 0x5a, 0x9f, 0x22, 0xac, 0x17, 0xf9, 0x9c, 0x22, 0x04, 0xbe, 0x4c, 0x21, 0x87,
0xe9, 0xf3, 0x76, 0x2a, 0xcb, 0xf1, 0x80, 0x73, 0xe3, 0xe5, 0x00, 0x04, 0x2b, 0xee, 0x07, 0xd6,
0x0d, 0x61, 0x92, 0x28, 0x84, 0x23, 0x9c, 0x71, 0xa2, 0x7e, 0x87, 0x47, 0x5b, 0xa5, 0x2a, 0xf1,
0x96, 0x12, 0x34, 0xd8, 0x36, 0x47, 0x56, 0x95, 0xb9, 0x29, 0x7d, 0xf0, 0xf5, 0x54, 0xc1, 0x4b,
0x11, 0x85, 0x51, 0x7c, 0x96, 0xeb, 0x4d, 0x87, 0xec, 0x16, 0x05, 0xd7, 0xff, 0x82, 0xd9, 0x99,
0x1d, 0x76, 0xc0, 0xc0, 0x77, 0x79, 0x7d, 0x61, 0x4a, 0x25, 0x82, 0xea, 0xb7, 0x8b, 0x58, 0xd5,
0x24, 0x6a, 0xe6, 0x45, 0x83, 0xd3, 0x01, 0x95, 0xe9, 0xf2, 0xcf, 0x56, 0xc4, 0x7e, 0xaf, 0x8d,
0x0a, 0xf9, 0xb8, 0x2f, 0xd1, 0x4a, 0xc8, 0x6e, 0x09, 0x43, 0xfa, 0x39, 0x66, 0x92, 0x68, 0x49,
0x28, 0x9d, 0xae, 0xe7, 0xd3, 0xa1, 0x60, 0xe5, 0xdc, 0x46, 0xbf, 0xa2, 0x5b, 0x48, 0xda, 0x4e,
0xd2, 0x73, 0x4b, 0x49, 0xe6, 0x75, 0x96, 0xdf, 0xe6, 0xbd, 0x60, 0x96, 0xc2, 0xa7, 0xe8, 0x34,
0x60, 0xef, 0x91, 0xab, 0xe3, 0x87, 0x1b, 0x97, 0xdd, 0x5d, 0x02, 0xb5, 0x23, 0x57, 0x98, 0x2f,
0x2b, 0xc2, 0xbb, 0x89, 0x3a, 0xa9, 0x60, 0xa1, 0x13, 0xf9, 0x93, 0xe4, 0xd6, 0xfd, 0xab, 0xf7,
0x02, 0x1d, 0x95, 0x6d, 0x0f, 0xe2, 0x1a, 0x44, 0xff, 0xd3, 0x16, 0x3d, 0x73, 0xe8, 0x35, 0x13,
0xad, 0xb6, 0xcd, 0x86, 0xe1, 0xfc, 0x84, 0x20, 0x8f, 0xe4, 0xe1, 0x1f, 0x2b, 0x1a, 0x03, 0x5f,
0x98, 0x43, 0x0c, 0x9e, 0x64, 0x75, 0xf6, 0xb3, 0x1b, 0x62, 0xb2, 0xaa, 0x13, 0x80, 0x1c, 0x82,
0xaa, 0xa0, 0x67, 0x47, 0x67, 0x5a, 0x02, 0xa8, 0xd6, 0x89, 0x6a, 0xbd, 0xb4, 0x98, 0x49, 0xcb,
0x21, 0x7c, 0xe5, 0x2c, 0x0c, 0xca, 0x65, 0x9a, 0x70, 0xbe, 0x39, 0x44, 0xf8, 0x2c, 0xfb, 0x0c,
0x73, 0xc7, 0x61, 0x4a, 0xb8, 0xdd, 0x14, 0xc0, 0x46, 0xef, 0x32, 0x6e, 0xca, 0xb2, 0x6d, 0x4f,
0xbb, 0x87, 0x00, 0x84, 0xeb, 0x6b, 0xab, 0x6d, 0x4a, 0xd2, 0xb1, 0xa2, 0x66, 0x93, 0xcf, 0x6a,
0x3f, 0x4a, 0xc4, 0x46, 0x8f, 0x46, 0x3e, 0x53, 0xd1, 0xcd, 0x0c, 0xbb, 0x6e, 0x08, 0xbc, 0x37,
0xbf, 0x54, 0x56, 0xe9, 0x4d, 0xe1, 0xf3, 0xfb, 0x7d, 0x3a, 0x00, 0xef, 0xff, 0x84, 0x64, 0x90,
0xcb, 0x03, 0xc8, 0xb7, 0xa7, 0x61, 0x00, 0x30, 0x74, 0x23, 0xde, 0x81, 0xea, 0xeb, 0xab, 0x47,
0x5f, 0x5d, 0x23, 0x60, 0xf7, 0x6e, 0x83, 0xe1, 0x99, 0xf0, 0xdb, 0x65, 0x26, 0x5b, 0x74, 0xdf,
0x66, 0x5b, 0x6c, 0x6e, 0xfe, 0xa7, 0x64, 0x9a, 0x53, 0x99, 0x1d, 0x5a, 0x0c, 0xa7, 0xa9, 0xa6,
0xec, 0x70, 0x78, 0x1a, 0xec, 0x60, 0x00, 0x7b, 0xc6, 0x26, 0xdb, 0x08, 0x3c, 0x13, 0x9e, 0x71,
0x87, 0xd4, 0xf2, 0x22, 0x01, 0x9f, 0x08, 0x96, 0x76, 0x28, 0xf9, 0xad, 0x79, 0x0d, 0x2b, 0x4e,
0xc0, 0xe9, 0xd0, 0x77, 0xc1, 0x2a, 0x04, 0xe8, 0x7a, 0x6e, 0x5d, 0xe3, 0xe7, 0x2e, 0x9d, 0x02,
0x6a, 0xf8, 0xc4, 0x4b, 0x95, 0xd9, 0xb6, 0xb7, 0x10, 0x58, 0x30, 0x9b, 0x7b, 0xf5, 0xfa, 0x3a,
0x09, 0xd1, 0x43, 0x95, 0xfc, 0xd3, 0xdb, 0xf5, 0xf8, 0xbd, 0x1a, 0xb6, 0xfd, 0x66, 0xf3, 0xc9,
0xb9, 0x3c, 0x48, 0x9d, 0xf7, 0xac, 0xf9, 0x63, 0x50, 0x55, 0x7a, 0x91, 0x88, 0x8f, 0x6c, 0x39,
0x83, 0xd3, 0xff, 0xdf, 0x9d, 0x67, 0x46, 0xa7, 0x15, 0xf4, 0x4c, 0x2e, 0x97, 0x59, 0xa5, 0xdd,
0xfc, 0xbf, 0x5e, 0x12, 0x59, 0x1f, 0xd1, 0x00, 0xe4, 0xe4, 0x37, 0xdf, 0x14, 0xae, 0x09, 0x6f,
0x52, 0x8b, 0xab, 0x55, 0xa0, 0x68, 0x0d, 0xea, 0x5f, 0x99, 0xcc, 0x17, 0xb3, 0xc1, 0xf6, 0x08,
0x39, 0xda, 0x6e, 0xb4, 0x1a, 0x55, 0x7a, 0xcc, 0x2f, 0x47, 0x64, 0xe3, 0xe0, 0x19, 0x37, 0xfb,
0x99, 0x2a, 0x7b, 0x01, 0xf4, 0x52, 0x73, 0x19, 0x8d, 0xc4, 0x61, 0x48, 0xfc, 0x3b, 0x1f, 0x64,
0xdf, 0xd7, 0xfe, 0xe0, 0x99, 0x80, 0x17, 0x0e, 0x82, 0xbf, 0x01, 0x68, 0x03, 0xbf, 0xfb, 0xc5,
0x91, 0x67, 0xaf, 0x72, 0x9e, 0xd0, 0x9f, 0xec, 0xc6, 0x14, 0x7c, 0x0b, 0x1d, 0x80, 0xbb, 0x60,
0xc3, 0xe5, 0xfd, 0x4e, 0x8e, 0xcc, 0x92, 0xdd, 0xb2, 0x1f, 0x01, 0x59, 0x3b, 0x31, 0x49, 0x54,
0x64, 0xd8, 0xd3, 0x75, 0xda, 0x82, 0x00, 0x50, 0xfd, 0x7f, 0x72, 0xd7, 0x9c, 0x79, 0xdf, 0xad,
0x65, 0xee, 0x1e, 0x15, 0x79, 0x7c, 0x24, 0xf3, 0x38, 0xc6, 0x1e, 0x17, 0x88, 0xbf, 0xdb, 0x79,
0x22, 0x9a, 0x2f, 0x3e, 0x30, 0x6a, 0xdb, 0x96, 0x84, 0x69, 0xde, 0x33, 0xfd, 0xcf, 0xad, 0x0a,
0xdd, 0x2f, 0xb6, 0xe6, 0xe2, 0x96, 0xe9, 0xc3, 0xb7, 0x44, 0xde, 0xdf, 0xc0, 0x1c, 0x02, 0x38,
0xa6, 0x44, 0xbe, 0xd4, 0x70, 0xd6, 0x4e, 0x01, 0xc0, 0x46, 0x99, 0x0c, 0x14, 0x81, 0x1e, 0xfd,
0x54, 0xae, 0xfc, 0x48, 0xa5, 0x1a, 0x35, 0x18, 0x51, 0x1f, 0x1c, 0x30, 0x99, 0x4f, 0x54, 0x5a,
0xcc, 0x2f, 0x65, 0x6d, 0x53, 0xa8, 0xa3, 0x2a, 0xad, 0x25, 0x83, 0x46, 0x0a, 0xdd, 0x85, 0xe6,
0xb4, 0x0a, 0x35, 0xae, 0x19, 0x38, 0xeb, 0xe4, 0x7d, 0x2d, 0xcd, 0xeb, 0x96, 0x4e, 0x0a, 0xb1,
0xa6, 0xcc, 0xb5, 0x08, 0xee, 0xc6, 0x3c, 0x91, 0xb2, 0x20, 0x7b, 0x5a, 0xf4, 0xf5, 0x99, 0xc8,
0x7b, 0x5b, 0x81, 0x0d, 0x8b, 0xba, 0x21, 0x05, 0xa3, 0xfa, 0x81, 0xee, 0x05, 0x96, 0xb0, 0x27,
0xc0, 0x8e, 0x25, 0x62, 0x9b, 0x0d, 0xa5, 0xed, 0xbf, 0xb0, 0x8a, 0xbf, 0x87, 0x78, 0x3f, 0x26,
0xac, 0x9c, 0x64, 0x9c, 0x58, 0xed, 0x2b, 0x6b, 0x0e, 0x58, 0x99, 0x52, 0x52, 0xa2, 0x84, 0x6f,
0xb8, 0x35, 0x72, 0xb4, 0xec, 0xa9, 0x4f, 0xde, 0x08, 0x09, 0xbd, 0xa7, 0x1c, 0x37, 0xc6, 0x17,
0xdb, 0xa9, 0xf6, 0xa0, 0x3e, 0x51, 0x4d, 0xb8, 0x02, 0x8c, 0xf4, 0x4b, 0x77, 0x51, 0xd3, 0xf9,
0xaf, 0x39, 0x39, 0x36, 0xf3, 0xa9, 0xf9, 0x64, 0x83, 0xd0, 0x9a, 0x4e, 0x08, 0xca, 0x24, 0x4a,
0x76, 0x2e, 0xc8, 0xfc, 0x17, 0x13, 0x42, 0xbc, 0x8d, 0x9f, 0x68, 0x4a, 0x0c, 0x47, 0x8c, 0x03,
0x43, 0x25, 0x5b, 0xdb, 0x36, 0x24, 0x72, 0xda, 0x06, 0x2f, 0xa0, 0xfb, 0x09, 0x35, 0xbf, 0x52,
0x4b, 0x4d, 0x80, 0xf7, 0x85, 0xe3, 0x96, 0x69, 0x69, 0xc9, 0xc3, 0x85, 0x3a, 0x9c, 0x65, 0xe7,
0x06, 0x21, 0x4b, 0xbc, 0x0e, 0x7a, 0x9c, 0x90, 0x2c, 0xe8, 0x75, 0x18, 0x0f, 0x93, 0x2a, 0xf9,
0x9a, 0xb0, 0xee, 0xf3, 0x34, 0x21, 0xed, 0x59, 0xb5, 0x78, 0x31, 0x32, 0x36, 0x3d, 0x25, 0x80,
0x06, 0x53, 0x04, 0xf3, 0x22, 0xf1, 0x85, 0x5d, 0x21, 0xb1, 0x3f, 0xed, 0xf9, 0x64, 0x73, 0x2f,
0xe4, 0x5b, 0x0a, 0x4b, 0x69, 0xe3, 0x5f, 0xc6, 0x93, 0x3b, 0x64, 0xb0, 0x6b, 0x29, 0x22, 0x60,
0x39, 0x40, 0x43, 0x1c, 0x18, 0x1f, 0x6f, 0x5f, 0x78, 0xce, 0xc8, 0xbd, 0xe4, 0x22, 0xd3, 0x61,
0xcb, 0x2e, 0xa9, 0xad, 0x81, 0x8f, 0x99, 0xcd, 0xb2, 0xc0, 0xc0, 0x6a, 0x4b, 0x5c, 0xaa, 0x75,
0x1e, 0x9d, 0x90, 0x86, 0x06, 0x9b, 0x68, 0x6c, 0x72, 0xd1, 0x15, 0x37, 0x5f, 0xa9, 0x2d, 0xb0,
0x13, 0xd7, 0x7b, 0xdd, 0xf3, 0xea, 0x6c, 0xd7, 0x3c, 0x6f, 0xd8, 0x99, 0xbb, 0xca, 0x64, 0xd7,
0xa1, 0x31, 0x7d, 0x1d, 0x9f, 0xc1, 0x41, 0x0c, 0xd6, 0x07, 0xb1, 0xba, 0x20, 0xea, 0x76, 0xa0,
0xa9, 0x46, 0xa7, 0x16, 0x28, 0x09, 0x63, 0xa6, 0x83, 0xaf, 0x7d, 0x9d, 0xac, 0xd3, 0x54, 0x2e,
0x57, 0x59, 0xcf, 0x07, 0x81, 0xfb, 0xe3, 0xa8, 0x1d, 0x90, 0x0f, 0x26, 0x8f, 0x5b, 0xcd, 0x37,
0xb3, 0x42, 0xc5, 0x5e, 0x3f, 0x39, 0xdd, 0x98, 0x81, 0xcb, 0xf7, 0xb9, 0xcb, 0x62, 0xa2, 0x83,
0xe7, 0xef, 0x33, 0x4a, 0x53, 0xa8, 0xfe, 0x1d, 0x93, 0xd6, 0xbf, 0xef, 0x7d, 0x82, 0x31, 0x5b,
0x86, 0x84, 0x5b, 0x17, 0xa9, 0xf5, 0x4f, 0x58, 0x34, 0xa8, 0xd2, 0x58, 0xb9, 0xfc, 0xe2, 0x9e,
0x18, 0xc1, 0xd4, 0x21, 0x77, 0xe9, 0x11, 0x6d, 0xca, 0x36, 0x21, 0xd7, 0x59, 0x03, 0xf7, 0x96,
0x02, 0xef, 0x8e, 0x93, 0x91, 0x74, 0x55, 0xf0, 0xdc, 0x78, 0xf5, 0xaf, 0x69, 0x72, 0x19, 0x1e,
0x41, 0xee, 0x59, 0x7d, 0x9e, 0xc3, 0x5b, 0xa2, 0xa3, 0x5b, 0x02, 0x40, 0xed, 0x96, 0xa4, 0x96,
0x28, 0x2d, 0x39, 0x2d, 0x8d, 0x15, 0xe9, 0xb3, 0x04, 0x50, 0x7b, 0x50, 0x36, 0x77, 0x7c, 0xc4,
0x4f, 0xfd, 0x9f, 0xb1, 0x72, 0x99, 0x6b, 0x51, 0x1e, 0x44, 0x18, 0xaa, 0xd2, 0x13, 0x06, 0xc5,
0x7b, 0x4d, 0xd5, 0x78, 0x34, 0xa5, 0x64, 0x0d, 0xfc, 0x7a, 0x07, 0x13, 0x82, 0xb7, 0xf9, 0xd3,
0x6b, 0x60, 0xb3, 0xf9, 0xb3, 0xd6, 0x99, 0x42, 0x2f, 0xfd, 0x6c, 0xcf, 0x72, 0x2a, 0xcf, 0xca,
0x03, 0x0a, 0x2d, 0x7b, 0x12, 0x5e, 0x24, 0xed, 0x92, 0x8c, 0x85, 0xc3, 0xf9, 0x13, 0x11, 0x41,
0xf9, 0xc1, 0x06, 0xce, 0xf8, 0x38, 0x07, 0xec, 0x82, 0x4d, 0xef, 0x99, 0xb1, 0x6b, 0xe3, 0x6a,
0x98, 0xcb, 0xef, 0x59, 0xc8, 0x81, 0x7e, 0x0b, 0x18, 0x60, 0xce, 0xd3, 0x27, 0x78, 0xbb, 0xea,
0x6b, 0xcf, 0xdd, 0xdc, 0x82, 0xaa, 0x2a, 0xa2, 0x12, 0xf3, 0x14, 0x8d, 0xae, 0xa3, 0xe5, 0x56,
0x4e, 0xda, 0xc8, 0xf2, 0xc6, 0xe5, 0xd7, 0x23, 0xe7, 0x6e, 0x19, 0x6b, 0x96, 0xd5, 0x92, 0xd8,
0x76, 0x7b, 0x77, 0x8d, 0x0b, 0x36, 0xa3, 0x4e, 0x69, 0xaa, 0x91, 0xaa, 0xac, 0x1b, 0x90, 0x46,
0x45, 0x43, 0xd8, 0xc0, 0xd2, 0x74, 0x36, 0xb3, 0xfa, 0xe8, 0xa5, 0xaa, 0x19, 0xe7, 0x06, 0x85,
0x59, 0xed, 0xa6, 0x71, 0xc3, 0xb4, 0xea, 0x26, 0xf4, 0x86, 0xd8, 0xf6, 0x4f, 0xc1, 0xa5, 0x29,
0xdf, 0xcb, 0xa8, 0x1a, 0xa5, 0x08, 0x43, 0x5c, 0xe4, 0x5d, 0x64, 0xc3, 0xc8, 0x1b, 0xea, 0x87,
0xf5, 0x5d, 0xd9, 0x40, 0x22, 0x11, 0xbf, 0xf1, 0xda, 0x9f, 0xfb, 0xe3, 0x1b, 0xac, 0x87, 0x09,
0x8e, 0x94, 0x39, 0x44, 0x39, 0xc0, 0x6e, 0x46, 0x17, 0x14, 0xe2, 0x56, 0xa8, 0x7c, 0x40, 0x5a,
0xf0, 0xd9, 0xee, 0xf7, 0x87, 0xbf, 0xf6, 0xd6, 0x5d, 0x26, 0x5c, 0x01, 0x44, 0xc9, 0xa1, 0xf6,
0x8f, 0xf9, 0x7c, 0xc1, 0x04, 0x7c, 0x7b, 0x6f, 0x5f, 0x68, 0xcd, 0x61, 0xb5, 0x81, 0x39, 0x57,
0x7f, 0xa2, 0xa0, 0xd3, 0x4a, 0xf2, 0xea, 0x30, 0xea, 0x2d, 0x20, 0xb5, 0xdb, 0x76, 0xee, 0xa1,
0x6f, 0x62, 0x0f, 0x9c, 0xd2, 0x58, 0x88, 0xb6, 0xb6, 0x03, 0x5e, 0x5a, 0xea, 0x24, 0x66, 0x53,
0x72, 0x25, 0xa1, 0xe6, 0x54, 0xeb, 0x03, 0x68, 0x5b, 0x92, 0x81, 0x07, 0x3b, 0x48, 0x25, 0xf6,
0x14, 0xbc, 0xb8, 0x27, 0x60, 0x8e, 0x1a, 0x22, 0x03, 0x47, 0x30, 0x56, 0x99, 0xca, 0x61, 0x03,
0xd9, 0xce, 0xaa, 0xa8, 0x02, 0x72, 0xc4, 0x3e, 0x94, 0x51, 0xd8, 0xdb, 0x88, 0x96, 0x35, 0xb6,
0x60, 0x2f, 0x80, 0x66, 0x91, 0x75, 0xb6, 0x10, 0x2f, 0x38, 0xb4, 0x69, 0x9a, 0xa8, 0x54, 0xea,
0x20, 0x67, 0xae, 0xa6, 0x8f, 0x1a, 0xbc, 0x1f, 0xe1, 0x25, 0xf2, 0xc4, 0xa8, 0x28, 0x2a, 0x8c,
0xcd, 0x25, 0xf4, 0xa1, 0x31, 0x38, 0x86, 0x15, 0x0c, 0x0c, 0xa5, 0x6b, 0x0f, 0xe4, 0x94, 0x65,
0xa5, 0x4e, 0xab, 0xf6, 0xb8, 0x2a, 0x04, 0x7c, 0x5f, 0x43, 0xd9, 0x42, 0x1c, 0xc9, 0x3d, 0x9a,
0xec, 0xc0, 0x64, 0xcb, 0x8e, 0x10, 0x64, 0x39, 0xfd, 0x70, 0x33, 0x4e, 0x17, 0x90, 0x0b, 0x5b,
0x40, 0xfa, 0x72, 0x2d, 0x1e, 0xb3, 0xc8, 0x44, 0x20, 0x36, 0x5d, 0x27, 0xef, 0x33, 0xdd, 0x91,
0xbe, 0xe9, 0x01, 0x01, 0x70, 0xf8, 0xbd, 0x1b, 0xa5, 0xd3, 0x52, 0x0f, 0xe7, 0x56, 0xe9, 0xa9,
0xce, 0x26, 0xa5, 0xe7, 0xd4, 0x9a, 0x7d, 0xaa, 0x39, 0x5b, 0x60, 0x86, 0x08, 0x3a, 0xf2, 0x12,
0x4d, 0x58, 0xf4, 0xea, 0x02, 0x6e, 0x1b, 0x8a, 0xeb, 0x83, 0x68, 0x15, 0x5a, 0x51, 0x7c, 0x24,
0xd2, 0x42, 0xd8, 0xdc, 0x07, 0xdf, 0x32, 0xd4, 0xb9, 0xc8, 0x0e, 0x00, 0xf2, 0xfb, 0x54, 0xf4,
0x25, 0x27, 0x50, 0xf0, 0xee, 0x4f, 0x7c, 0xeb, 0xe0, 0x07, 0x5c, 0xfc, 0x17, 0x2c, 0x1a, 0x8f,
0xde, 0x32, 0xcb, 0xb1, 0x9d, 0xae, 0xb5, 0x9a, 0xfd, 0x5f, 0xec, 0x06, 0x9e, 0x22, 0xc1, 0x24,
0x1b, 0x76, 0xd6, 0x8d, 0x01, 0x18, 0xc6, 0x94, 0x7d, 0x27, 0xe5, 0xc0, 0xd5, 0xc2, 0x99, 0x52,
0x98, 0x38, 0x67, 0xb5, 0x51, 0x7a, 0x38, 0xce, 0x09, 0x29, 0x72, 0x69, 0xe1, 0xd5, 0xa7, 0x46,
0xfa, 0xeb, 0x00, 0x2a, 0xdc, 0xe5, 0xdb, 0x0f, 0x1e, 0x2a, 0x7e, 0x0f, 0xa5, 0x73, 0x0f, 0xe1,
0x19, 0x4a, 0xcc, 0xf6, 0x6f, 0xa4, 0x34, 0xa4, 0xd3, 0x4a, 0xde, 0xc2, 0x6d, 0x6b, 0x78, 0x5e,
0x74, 0x86, 0xa4, 0x16, 0xdf, 0x01, 0x22, 0x5f, 0xe7, 0xcd, 0xcc, 0x48, 0xc3, 0x48, 0xd6, 0x26,
0x6c, 0x50, 0x38, 0x45, 0xd7, 0xa0, 0x64, 0x08, 0x79, 0x18, 0xce, 0xb8, 0xcd, 0x4d, 0x1b, 0x16,
0xa0, 0x28, 0x28, 0x80, 0xbf, 0x91, 0xb4, 0xc5, 0xae, 0xfa, 0x80, 0x07, 0x34, 0xab, 0x2d, 0x72,
0x48, 0x2f, 0x17, 0x88, 0xd5, 0x2c, 0xa9, 0xa8, 0x99, 0xe2, 0xba, 0x13, 0x10, 0x79, 0x61, 0x3e,
0x80, 0x6f, 0xfe, 0xc2, 0xdd, 0xfa, 0x5d, 0x21, 0x3a, 0xce, 0x14, 0xef, 0x23, 0xad, 0x5c, 0x1f,
0x6e, 0x45, 0xfa, 0x48, 0x2b, 0xcb, 0xc7, 0xb4, 0x22, 0x7c, 0xb4, 0x95, 0xdc, 0x28, 0x73, 0x33,
0xa0, 0x30, 0xf3, 0xf5, 0xc7, 0xe7, 0xd9, 0xd6, 0x71, 0xcf, 0xb4, 0x92, 0xa0, 0x74, 0x80, 0x75,
0x3e, 0xe1, 0x64, 0x80, 0x9c, 0x79, 0x2c, 0x2c, 0x1b, 0xe7, 0xa3, 0xe4, 0x04, 0xad, 0x54, 0xfd,
0x97, 0x64, 0xa1, 0x66, 0x9e, 0x99, 0x0c, 0x0f, 0x82, 0x7f, 0x49, 0xf7, 0x18, 0x10, 0xba, 0xb1,
0xf6, 0x16, 0x26, 0xee, 0x55, 0xc9, 0x1b, 0x22, 0x82, 0x66, 0x54, 0xa3, 0xaf, 0x3f, 0x09, 0x87,
0x53, 0x6c, 0x03, 0xa9, 0xa4, 0xbc, 0x2c, 0x4b, 0x92, 0x9d, 0xf1, 0x09, 0xd5, 0x67, 0xeb, 0x06,
0x02, 0x5e, 0x49, 0x63, 0xbc, 0xbb, 0xcb, 0x49, 0x70, 0xb2, 0xfa, 0x23, 0xa8, 0xc4, 0x2d, 0x5d,
0x35, 0x47, 0xa7, 0x3a, 0xdc, 0xd2, 0x9e, 0x7e, 0x05, 0xee, 0xcd, 0xdb, 0x92, 0x59, 0x27, 0x7a,
0xe8, 0x68, 0x67, 0xc7, 0xe9, 0x9b, 0xef, 0x1e, 0x47, 0x9c, 0x36, 0x55, 0x0e, 0x4e, 0xe9, 0x23,
0xf3, 0x0d, 0xb8, 0x0a, 0x92, 0xda, 0xe2, 0xaa, 0xec, 0xbf, 0x6e, 0xe3, 0x13, 0x86, 0x10, 0xa7,
0xd0, 0x48, 0x7c, 0x1c, 0xab, 0xd5, 0x2d, 0xfd, 0xcf, 0x1a, 0x53, 0x6e, 0x9e, 0xf7, 0x97, 0xf7,
0xa0, 0x44, 0xb5, 0xe3, 0x59, 0xbe, 0xfa, 0xc0, 0x3f, 0x3e, 0xf4, 0xaa, 0x8f, 0xf9, 0x2a, 0xea,
0xd6, 0xfc, 0xd9, 0xf0, 0xed, 0x62, 0xad, 0x43, 0x20, 0x91, 0x2f, 0xa8, 0x06, 0x49, 0x80, 0x3c,
0xf0, 0x98, 0xef, 0xd4, 0xda, 0x21, 0xcc, 0xf0, 0xb2, 0xdc, 0xda, 0x69, 0xca, 0xfd, 0x33, 0x25,
0x6f, 0x9a, 0x96, 0x32, 0x44, 0x48, 0xf9, 0x46, 0xb7, 0x4c, 0x15, 0x4f, 0xd3, 0x22, 0x11, 0xaf,
0xd6, 0x83, 0x14, 0x7c, 0xbb, 0xf3, 0x52, 0xc9, 0x7f, 0xc1, 0xbc, 0x9b, 0x9f, 0xf0, 0x0a, 0xe3,
0x12, 0xa0, 0x28, 0xef, 0xd8, 0x41, 0x69, 0xd4, 0x49, 0xcb, 0x5b, 0x8d, 0xce, 0x6a, 0x46, 0xa9,
0x79, 0x22, 0xae, 0x6b, 0x3a, 0x0f, 0xd3, 0x5a, 0x2a, 0xcb, 0x95, 0x83, 0x93, 0x4e, 0x9b, 0x5a,
0x79, 0xf4, 0xa5, 0x61, 0x2e, 0x48, 0xc5, 0x9d, 0xa4, 0x71, 0xd4, 0x1d, 0xd5, 0xc7, 0x6b, 0x7d,
0x21, 0x7d, 0x76, 0x3f, 0x27, 0xf6, 0x22, 0x58, 0x9d, 0x2b, 0x46, 0xb1, 0xf5, 0xa9, 0x58, 0xd6,
0x01, 0x87, 0xd3, 0xe4, 0x35, 0x45, 0x09, 0x41, 0x5a, 0xfb, 0x60, 0x16, 0x05, 0xc2, 0x2a, 0x62,
0xb3, 0xf7, 0xdc, 0xcc, 0x97, 0x54, 0x14, 0x52, 0xd1, 0x72, 0x8c, 0x08, 0x26, 0xfa, 0x69, 0xe8,
0x08, 0xec, 0xaf, 0x5b, 0x10, 0x72, 0x01, 0x4b, 0x6c, 0x29, 0x2a, 0x72, 0xc8, 0xc6, 0xe5, 0xaa,
0x53, 0xb9, 0x33, 0x16, 0xac, 0x86, 0x5e, 0xf3, 0xae, 0x2d, 0x78, 0xa2, 0x58, 0x1c, 0xcf, 0x6d,
0x4b, 0xd6, 0x63, 0x21, 0x89, 0x03, 0xca, 0xc5, 0x93, 0x3e, 0x60, 0x18, 0x62, 0x0b, 0xab, 0x83,
0xc9, 0x38, 0x3b, 0xe6, 0xd2, 0xab, 0x32, 0xa4, 0xc5, 0x3e, 0xb5, 0x4e, 0xad, 0x0b, 0x34, 0xb5,
0x95, 0x78, 0xfa, 0xed, 0x4d, 0x40, 0x58, 0x58, 0x1d, 0xf5, 0xef, 0xd6, 0x44, 0xcd, 0xbb, 0xfd,
0xad, 0x7b, 0xb7, 0x37, 0x7b, 0xaf, 0x7f, 0x8f, 0xbe, 0xf7, 0xc8, 0x60, 0xbe, 0xfc, 0xed, 0xe8,
0xcf, 0x8a, 0x0d, 0xcc, 0x05, 0x3d, 0x89, 0xd8, 0xb9, 0xa7, 0xea, 0xea, 0xda, 0x1e, 0x22, 0x20,
0xb6, 0x76, 0x73, 0x2c, 0x9e, 0x00, 0x96, 0x6c, 0x14, 0x05, 0x54, 0x93, 0x69, 0xa2, 0x5e, 0x98,
0x79, 0x98, 0xcc, 0xa8, 0xa9, 0xea, 0xd3, 0xe8, 0xbf, 0x3c, 0x22, 0x71, 0x0a, 0xd0, 0xae, 0x23,
0x1d, 0xb8, 0x77, 0x54, 0xa6, 0xff, 0x3a, 0x4b, 0x05, 0xe8, 0xc2, 0x84, 0xe2, 0x83, 0xca, 0x99,
0x60, 0x2c, 0x60, 0xe5, 0x43, 0x08, 0x60, 0x34, 0x7b, 0x5d, 0x5e, 0x82, 0xe1, 0xee, 0xf4, 0x11,
0x16, 0x22, 0x9f, 0xb5, 0x4d, 0x5a, 0xdf, 0x29, 0x46, 0xcf, 0xc0, 0x09, 0x38, 0x0e, 0x14, 0x19,
0xbe, 0x5e, 0x53, 0x4c, 0xf1, 0xa5, 0x3b, 0x5c, 0x61, 0xc3, 0xb6, 0x24, 0x6b, 0xc9, 0xb0, 0x22,
0xba, 0x53, 0xe9, 0xae, 0x6f, 0x53, 0xdb, 0x93, 0x77, 0xee, 0xa4, 0x92, 0xa5, 0xdb, 0xb7, 0xb4,
0xce, 0xca, 0xe4, 0x51, 0x02, 0x8b, 0xc4, 0x94, 0x91, 0x98, 0xe5, 0xfd, 0x90, 0x1b, 0xd6, 0x0d,
0x97, 0xd4, 0xa9, 0xfe, 0x00, 0xa2, 0x5c, 0x4a, 0xfd, 0x32, 0xe7, 0x2a, 0xfe, 0x21, 0x2c, 0xee,
0xb6, 0xac, 0x57, 0x52, 0x73, 0xc7, 0xa1, 0x50, 0x2b, 0x79, 0xb5, 0x94, 0xf9, 0xe0, 0x36, 0x0e,
0xea, 0xc5, 0xb1, 0x35, 0xbf, 0x7f, 0xec, 0xee, 0xdc, 0x1c, 0x1f, 0x77, 0x28, 0xb7, 0xb8, 0xd1,
0x79, 0xa9, 0x16, 0x31, 0xed, 0x52, 0x51, 0x71, 0xee, 0x28, 0xd4, 0x4b, 0x8b, 0x77, 0x36, 0xd2,
0x19, 0x65, 0x64, 0x3f, 0xbd, 0x6e, 0x13, 0xea, 0xaf, 0x85, 0x11, 0xe7, 0x16, 0x2b, 0xfd, 0x28,
0x8f, 0xe2, 0x16, 0x40, 0x0f, 0x25, 0xa2, 0x3c, 0x94, 0x0e, 0xbc, 0xbe, 0x09, 0x31, 0x03, 0x25,
0xd8, 0x87, 0x16, 0xe6, 0xe4, 0x89, 0x4a, 0x38, 0x00, 0x35, 0xd3, 0x8a, 0xcf, 0xcc, 0x20, 0x03,
0x2d, 0x58, 0xd7, 0xd6, 0xf3, 0xef, 0xa6, 0xd5, 0x09, 0x6d, 0x98, 0x71, 0xa5, 0xff, 0x39, 0x0a,
0x4d, 0xf2, 0xd7, 0xae, 0xdc, 0x6b, 0xeb, 0xb2, 0x86, 0x9e, 0x8f, 0x85, 0x9c, 0x3f, 0xbf, 0xcf,
0xfb, 0x7d, 0x01, 0x9b, 0xd1, 0x55, 0xed, 0xd6, 0x88, 0xf3, 0x02, 0x1e, 0x71, 0x75, 0xb9, 0xd0,
0xd1, 0xaa, 0x9e, 0xb7, 0x88, 0x9a, 0x44, 0x3e, 0xe9, 0x28, 0x3a, 0xa3, 0x1d, 0x9a, 0xc8, 0x4a,
0xcd, 0xd8, 0x2b, 0x6f, 0x02, 0x9b, 0x32, 0x8a, 0x70, 0x96, 0x75, 0xaa, 0xc5, 0x2f, 0xaa, 0x86,
0x59, 0x48, 0x09, 0x42, 0xf3, 0xf3, 0x0d, 0xe5, 0x16, 0x48, 0xdd, 0x3a, 0x10, 0xa4, 0x6f, 0x2d,
0x0c, 0xd2, 0x54, 0xa2, 0x6e, 0x6a, 0xa6, 0xe7, 0x10, 0x41, 0x1c, 0x93, 0xeb, 0xed, 0x25, 0x78,
0x86, 0x3c, 0x40, 0xfb, 0x69, 0x43, 0x33, 0x2d, 0x6e, 0xcf, 0x92, 0xcc, 0xbc, 0x2a, 0x5e, 0x24,
0x16, 0xdf, 0x94, 0x8c, 0x8c, 0xa8, 0xc7, 0xc7, 0x17, 0x1d, 0x4b, 0x2f, 0x9b, 0x03, 0x5f, 0x8f,
0x36, 0xd4, 0x4d, 0x04, 0xcd, 0x54, 0x91, 0x1c, 0x56, 0x87, 0x21, 0x23, 0xc4, 0x38, 0x5a, 0x0c,
0xb1, 0x93, 0x35, 0x61, 0x81, 0xca, 0x84, 0xb0, 0xa2, 0x89, 0xbc, 0xdb, 0x64, 0x67, 0x87, 0x50,
0x3f, 0x2d, 0x11, 0xc1, 0x22, 0x65, 0x02, 0x5a, 0x46, 0x87, 0x8b, 0x7e, 0x68, 0x7f, 0x74, 0x36,
0x52, 0x18, 0x89, 0xbc, 0x21, 0xd6, 0x8f, 0x87, 0x12, 0xf5, 0xb0, 0x45, 0xb6, 0x1d, 0x0e, 0x9c,
0x17, 0xe9, 0x66, 0xb7, 0x1c, 0xac, 0x41, 0xcc, 0xf8, 0x9b, 0xb0, 0x7a, 0x98, 0xc0, 0xb3, 0xc1,
0x2d, 0x76, 0x07, 0xf5, 0xc3, 0x2f, 0x84, 0xfa, 0xea, 0xf4, 0xf9, 0x1e, 0x18, 0x23, 0x66, 0xb9,
0xb9, 0x80, 0xec, 0x70, 0x3a, 0x3a, 0xc7, 0x42, 0xff, 0xe4, 0xa0, 0x70, 0x74, 0x95, 0xfd, 0x66,
0x0b, 0xdd, 0x55, 0xcb, 0x9c, 0x98, 0x98, 0x42, 0xbc, 0xc1, 0x38, 0x1d, 0x13, 0x3f, 0xc7, 0x08,
0xe0, 0xe6, 0x0a, 0xc9, 0xd8, 0x13, 0x11, 0x18, 0x4f, 0x34, 0x53, 0xf4, 0x0c, 0x76, 0xdc, 0x7f,
0x06, 0x60, 0xdc, 0x23, 0xb6, 0x53, 0x04, 0x44, 0x3a, 0x1e, 0x52, 0x70, 0xe8, 0xe7, 0x69, 0xca,
0xba, 0xb0, 0x3b, 0x4e, 0x6a, 0xa1, 0x83, 0x24, 0xb6, 0x6e, 0xc2, 0x42, 0x86, 0x2c, 0xa4, 0x1b,
0x02, 0xa8, 0xcd, 0x64, 0xfb, 0x23, 0x1f, 0x5e, 0x4c, 0xdd, 0xc7, 0x0a, 0x87, 0xe2, 0xab, 0x3f,
0xce, 0x6d, 0x15, 0xe4, 0x99, 0xa3, 0x63, 0x76, 0x51, 0xca, 0x53, 0x6b, 0x43, 0x39, 0xce, 0x38,
0xd4, 0x23, 0x90, 0x2c, 0x4b, 0x0f, 0xc6, 0x6c, 0x1c, 0x3e, 0x65, 0x2a, 0x64, 0x15, 0x91, 0x56,
0x6a, 0x04, 0x67, 0x0e, 0x63, 0xcf, 0x37, 0x2f, 0xc7, 0x82, 0xb4, 0xcc, 0xae, 0xf6, 0xa7, 0x28,
0xbd, 0xa2, 0x76, 0x2f, 0x60, 0x7b, 0x3c, 0x7f, 0x82, 0x2f, 0xb4, 0x4b, 0x44, 0xbc, 0xc8, 0xe4,
0x63, 0xce, 0x5d, 0x5f, 0x7d, 0xde, 0xb9, 0x23, 0x96, 0x16, 0x91, 0x65, 0x2f, 0xd8, 0x2a, 0xb9,
0x73, 0x04, 0x73, 0xaa, 0x39, 0x17, 0x62, 0x43, 0xbc, 0x89, 0xe8, 0x83, 0xa0, 0x13, 0x00, 0x0b,
0x59, 0xb2, 0x44, 0x30, 0x9a, 0xd0, 0x73, 0xaa, 0x8a, 0x64, 0xfb, 0xff, 0x8e, 0xe2, 0xcd, 0xa5,
0x23, 0xfb, 0xcc, 0x9d, 0x47, 0x8b, 0xc7, 0xf2, 0xb6, 0x23, 0x63, 0x7a, 0x6c, 0x3e, 0xb3, 0x03,
0xc1, 0xae, 0xe5, 0x45, 0x50, 0xd1, 0x88, 0x3e, 0x2a, 0xd5, 0xc2, 0x1e, 0x94, 0x1e, 0x27, 0x6e,
0x35, 0xdc, 0xd5, 0x38, 0x37, 0xcc, 0xb2, 0x01, 0x10, 0x45, 0x3b, 0xf2, 0xee, 0xee, 0xb6, 0xb7,
0xbe, 0x7e, 0xc0, 0x80, 0x2b, 0x2c, 0xb5, 0xb2, 0x39, 0x89, 0x0b, 0x4c, 0x47, 0xc5, 0x57, 0xd0,
0xac, 0xb7, 0x23, 0xcf, 0x5e, 0x7c, 0x4d, 0x8e, 0x2e, 0x3a, 0x7c, 0xda, 0xc4, 0xcb, 0x85, 0x63,
0x04, 0xb8, 0xd7, 0x1f, 0x4d, 0xb8, 0xed, 0x65, 0xe7, 0x95, 0x4f, 0x04, 0x7a, 0x5a, 0x3b, 0x8e,
0x1a, 0xc9, 0x0b, 0x13, 0x53, 0x26, 0xeb, 0xb8, 0x57, 0x84, 0x5a, 0xa6, 0x54, 0xc1, 0x81, 0x3a,
0x4c, 0xb6, 0x55, 0xc5, 0xd3, 0x7f, 0xaf, 0x27, 0x30, 0xeb, 0xce, 0x5c, 0x61, 0xd7, 0xed, 0xdc,
0xe5, 0x6a, 0x67, 0xda, 0xf4, 0x70, 0x87, 0xad, 0xfe, 0xf5, 0x4e, 0x9f, 0x69, 0x91, 0xa1, 0x8a,
0x39, 0x23, 0x50, 0x99, 0x4d, 0x9e, 0x43, 0x11, 0xbb, 0x78, 0x51, 0x2b, 0x5d, 0xe2, 0xbf, 0xbf,
0xef, 0x48, 0xdd, 0x56, 0xf1, 0xde, 0x57, 0x01, 0x5f, 0x34, 0x84, 0x27, 0x83, 0x3b, 0xad, 0x69,
0xdd, 0xdb, 0xc0, 0x08, 0x49, 0xbd, 0x70, 0x39, 0x71, 0x08, 0x0b, 0x43, 0xc3, 0xe0, 0xb2, 0x5d,
0x79, 0xc9, 0x90, 0x2d, 0xf2, 0x4b, 0xb0, 0x63, 0xef, 0x8d, 0x80, 0xd9, 0x38, 0xea, 0x96, 0x90,
0xc8, 0x5b, 0xbd, 0x92, 0x34, 0xc2, 0x1c, 0x6f, 0x9e, 0x07, 0x2f, 0x71, 0x43, 0x47, 0x23, 0xbe,
0xb9, 0xc2, 0xea, 0x3c, 0x7d, 0x28, 0xaf, 0xe3, 0xa2, 0x2d, 0xd8, 0x4e, 0x79, 0x99, 0x2d, 0x07,
0x2d, 0xbb, 0x6e, 0x1e, 0x9c, 0xed, 0x6f, 0x9f, 0x9c, 0xd7, 0x7e, 0xb0, 0x91, 0x70, 0x6e, 0x47,
0x60, 0x7b, 0x36, 0x90, 0x83, 0xbf, 0x5a, 0x5d, 0x4a, 0x80, 0x83, 0xb8, 0xe0, 0x14, 0xf8, 0xcb,
0xb7, 0xfa, 0xc4, 0x61, 0x20, 0x1b, 0x76, 0x61, 0x0b, 0x08, 0x24, 0xf4, 0x27, 0x5b, 0x11, 0xa2,
0x9b, 0x48, 0xcf, 0x60, 0xc0, 0x64, 0x7c, 0x85, 0x7f, 0x1f, 0x10, 0xbe, 0xc4, 0x28, 0xdd, 0x8d,
0x80, 0x65, 0x27, 0x40, 0x9e, 0xa1, 0xfd, 0x6c, 0x63, 0x18, 0x5f, 0x6c, 0x7c, 0x46, 0xb3, 0x4d,
0x7c, 0xfb, 0xd9, 0x1d, 0x59, 0x12, 0x75, 0x30, 0xcd, 0x85, 0x8a, 0x09, 0xcc, 0x39, 0xf1, 0x9a,
0x1d, 0x5d, 0x1c, 0x4a, 0xdf, 0x60, 0x81, 0xe1, 0x64, 0x34, 0xa6, 0x2e, 0xa0, 0x36, 0x2b, 0xa7,
0x6d, 0x4e, 0xc2, 0x7e, 0x2d, 0x2d, 0xc7, 0xcb, 0x0b, 0xe1, 0xde, 0x92, 0x47, 0x48, 0x7e, 0x3c,
0x51, 0xe8, 0xc0, 0x0a, 0xc9, 0x1a, 0x24, 0x72, 0x9e, 0x04, 0xd0, 0x57, 0x5c, 0x76, 0xbe, 0x87,
0xe1, 0x21, 0xdb, 0xb0, 0x4c, 0xfd, 0xb9, 0xa3, 0x11, 0xb9, 0x5d, 0x49, 0xc8, 0x49, 0xf9, 0x25,
0x1f, 0xc2, 0xbf, 0xff, 0x6b, 0x89, 0x10, 0x01, 0xe5, 0x6a, 0xc8, 0x31, 0xcf, 0x70, 0xfe, 0x45,
0x23, 0x27, 0x22, 0xef, 0x86, 0xc7, 0xc7, 0x8c, 0x80, 0x76, 0x4a, 0xe5, 0x71, 0xc3, 0x75, 0x6e,
0xa1, 0xc9, 0xf1, 0x9b, 0xa7, 0x81, 0x6f, 0x0e, 0x6b, 0xe4, 0x10, 0xde, 0x58, 0x36, 0x49, 0x57,
0xde, 0x63, 0xbb, 0x62, 0xb5, 0x88, 0x95, 0x47, 0x22, 0x97, 0xca, 0x6b, 0x40, 0x3e, 0x9d, 0x54,
0xfc, 0x36, 0xb6, 0xa8, 0xa6, 0x5a, 0xa9, 0x3e, 0x43, 0xd1, 0xd0, 0x81, 0x2f, 0x40, 0x73, 0x48,
0x2a, 0x6d, 0x57, 0x11, 0xd6, 0x76, 0xce, 0xf1, 0x12, 0x2e, 0x36, 0xc2, 0x38, 0x1b, 0x79, 0x3a,
0x04, 0x6f, 0x58, 0x53, 0xbb, 0x80, 0xa0, 0x38, 0x16, 0xf9, 0x0c, 0xbd, 0xe0, 0x0b, 0x6e, 0x88,
0xa4, 0x0d, 0xe8, 0x62, 0x07, 0x49, 0xd5, 0xc3, 0x6e, 0xf5, 0xfe, 0xc2, 0x6c, 0x98, 0x61, 0xb3,
0xf6, 0xfb, 0x08, 0x97, 0xc9, 0xf7, 0xd1, 0x7f, 0x99, 0xfd, 0x3e, 0x06, 0xfe, 0x6f, 0xb9, 0x8d,
0x71, 0x61, 0xef, 0x84, 0x94, 0x0b, 0x42, 0x5d, 0xca, 0xef, 0x26, 0xe4, 0xeb, 0x0d, 0xf6, 0x3f,
0x20, 0xa3, 0xed, 0xb1, 0xa4, 0x3c, 0xdc, 0xd8, 0xdb, 0x1d, 0x1a, 0x01, 0x21, 0x63, 0xa9, 0x45,
0x00, 0x81, 0xba, 0xeb, 0x81, 0xca, 0xdb, 0xb3, 0x93, 0x67, 0x7a, 0x57, 0xa6, 0x72, 0x46, 0xb3,
0x5d, 0x04, 0x93, 0xcc, 0x21, 0x64, 0xa0, 0xb9, 0xb3, 0x54, 0x99, 0x4e, 0xe9, 0x37, 0x9d, 0xf5,
0x74, 0x58, 0x44, 0x6e, 0xa8, 0x14, 0x28, 0x7a, 0x7b, 0x4f, 0x8e, 0x13, 0xaa, 0xaa, 0x7e, 0x9c,
0x4a, 0x26, 0x87, 0x3e, 0xb8, 0x44, 0x9d, 0xd3, 0xe6, 0x93, 0xe5, 0xb9, 0x99, 0x1c, 0xcf, 0xf1,
0x20, 0x56, 0xe9, 0x1a, 0x49, 0x08, 0x2d, 0xa2, 0xe9, 0x37, 0x28, 0xcc, 0xee, 0x6c, 0x11, 0x83,
0x25, 0x18, 0x7f, 0x57, 0x18, 0x3b, 0xf7, 0x6c, 0x56, 0x41, 0xa0, 0x42, 0x6f, 0x37, 0xd5, 0x2b,
0x65, 0x38, 0x23, 0x86, 0x1a, 0x74, 0x13, 0x92, 0xcd, 0x16, 0xcc, 0x26, 0x45, 0x58, 0x1d, 0x4c,
0xc4, 0x4e, 0x6b, 0x8c, 0x71, 0x62, 0x9d, 0x83, 0x0f, 0xb0, 0xe6, 0xae, 0xcc, 0xd0, 0xcc, 0x70,
0xdb, 0x23, 0xe9, 0x61, 0x9f, 0xf2, 0xf4, 0x2a, 0xde, 0x16, 0x4d, 0x9a, 0x37, 0xa7, 0xdb, 0xf9,
0x1d, 0x6d, 0x28, 0x8d, 0x10, 0xee, 0x22, 0xcf, 0xc4, 0x16, 0x58, 0x8c, 0xc8, 0xbf, 0xce, 0x5f,
0x6a, 0x66, 0x3f, 0x4f, 0x55, 0xad, 0xa4, 0x08, 0xd2, 0x81, 0x6e, 0x27, 0x8f, 0x65, 0xca, 0x49,
0xd4, 0xb9, 0x54, 0xcb, 0x8f, 0x04, 0xa1, 0x64, 0xb7, 0xfd, 0x7d, 0x1d, 0x46, 0xe3, 0xaa, 0x22,
0x02, 0x23, 0x27, 0x80, 0xd5, 0xbf, 0xee, 0xbe, 0xda, 0xd7, 0x6d, 0x5d, 0x44, 0x0f, 0x66, 0x16,
0x4f, 0x5d, 0x2a, 0x3b, 0x39, 0xbf, 0xf4, 0xf2, 0x3b, 0xdc, 0x90, 0xc8, 0x11, 0xdb, 0x15, 0x34,
0x27, 0xef, 0x3c, 0x94, 0x99, 0x19, 0x08, 0x87, 0xe1, 0xe0, 0x19, 0x6e, 0xcd, 0x23, 0x9d, 0x7d,
0x56, 0x6f, 0xe0, 0x7f, 0x13, 0x99, 0x4a, 0x50, 0xdc, 0x70, 0xa9, 0x93, 0xaa, 0x60, 0xea, 0x3e,
0x5f, 0xb7, 0x70, 0xca, 0xda, 0x64, 0x3b, 0x8a, 0x56, 0x90, 0x83, 0xa0, 0x5a, 0x59, 0xdc, 0x03,
0xcd, 0x2e, 0xa7, 0xc8, 0xa2, 0xe5, 0xde, 0x2c, 0x78, 0x60, 0x8c, 0xd5, 0xdf, 0x47, 0xfc, 0xba,
0x7a, 0xc3, 0xea, 0x54, 0xf6, 0xf8, 0x50, 0x25, 0x81, 0x54, 0xbb, 0x5a, 0x61, 0x98, 0x8f, 0xd1,
0x30, 0xa3, 0x05, 0xff, 0x74, 0x56, 0xd9, 0x82, 0x69, 0x24, 0x8c, 0x8c, 0x54, 0x01, 0xfa, 0x47,
0xf4, 0x9e, 0x04, 0x14, 0x9b, 0x5c, 0x76, 0x52, 0x60, 0x9a, 0x8a, 0x29, 0xec, 0x15, 0xb8, 0x76,
0x59, 0x68, 0x5c, 0xe5, 0xb4, 0x31, 0x6e, 0x3f, 0xd4, 0xf1, 0x9c, 0x5e, 0x44, 0xef, 0x52, 0xb9,
0x1b, 0x88, 0x64, 0x08, 0x8d, 0x52, 0x91, 0xdb, 0xdc, 0xd5, 0x10, 0xd4, 0xc3, 0xe8, 0x0d, 0x15,
0x38, 0x6b, 0xb2, 0xc2, 0x7e, 0xb6, 0x9f, 0xab, 0xd9, 0x75, 0x40, 0x5c, 0xe7, 0xde, 0x3e, 0xca,
0x4e, 0x9f, 0x73, 0x84, 0xd8, 0x6c, 0x86, 0x91, 0x05, 0xf5, 0xbe, 0xaf, 0xd4, 0x63, 0x07, 0x73,
0x3a, 0x9c, 0xe6, 0x96, 0x3c, 0x22, 0xd7, 0x68, 0x7a, 0xc3, 0x2f, 0x3b, 0xcd, 0x14, 0x7d, 0x6c,
0xd0, 0x95, 0x3e, 0x70, 0x18, 0x98, 0x6f, 0xba, 0xde, 0x32, 0xa0, 0xb8, 0x2d, 0xb9, 0x6e, 0x9a,
0x5b, 0x00, 0x36, 0x15, 0x82, 0x27, 0x48, 0xae, 0x3a, 0xa5, 0x99, 0x53, 0x28, 0x0d, 0x31, 0xe9,
0x3f, 0xae, 0xbb, 0x12, 0xb1, 0xc1, 0xbe, 0x23, 0xcb, 0x01, 0x8b, 0x8b, 0x96, 0x63, 0x0f, 0x53,
0x07, 0xdd, 0x37, 0xde, 0x99, 0x49, 0x53, 0xe7, 0x28, 0xc8, 0x7e, 0xc6, 0x14, 0x4d, 0x4a, 0x32,
0xc1, 0xab, 0xe3, 0xc7, 0xf8, 0x88, 0x80, 0x3d, 0x2e, 0xec, 0xc9, 0x0b, 0xb6, 0xaf, 0x52, 0xa7,
0x1c, 0x1f, 0x44, 0x05, 0x1e, 0x90, 0xfb, 0x87, 0x91, 0xa9, 0x08, 0x86, 0xc4, 0xde, 0x5b, 0xa2,
0x46, 0x79, 0xff, 0x28, 0x77, 0x7c, 0x30, 0x6c, 0xad, 0xb4, 0x47, 0xb7, 0x5d, 0x8b, 0x57, 0x6f,
0x92, 0x4c, 0x57, 0xd7, 0xf9, 0x98, 0x0d, 0x2e, 0xdb, 0x7e, 0xb8, 0x4c, 0xab, 0xc4, 0xc6, 0xa7,
0xbf, 0xf8, 0x7e, 0xea, 0x78, 0x3d, 0xa9, 0x63, 0x57, 0xee, 0xba, 0x36, 0xea, 0x69, 0x87, 0x24,
0x11, 0xee, 0x23, 0xa2, 0x43, 0x5f, 0x3d, 0xb1, 0xe9, 0x36, 0x97, 0xe7, 0x41, 0xe2, 0x90, 0x3c,
0xc6, 0x14, 0x47, 0x1c, 0xfd, 0x7a, 0xb5, 0xc7, 0xf9, 0x62, 0x6c, 0x45, 0xaa, 0xde, 0xab, 0x74,
0xd2, 0xbd, 0x22, 0xed, 0xbe, 0x12, 0x98, 0x10, 0x13, 0x76, 0xd0, 0x10, 0x73, 0x6f, 0x93, 0x68,
0x2c, 0x5f, 0x85, 0x60, 0xcd, 0x20, 0x27, 0x8f, 0xe6, 0xb9, 0xd7, 0x06, 0xdc, 0x00, 0x1a, 0xaa,
0x81, 0xfd, 0x3a, 0xf7, 0x25, 0xe5, 0x53, 0x14, 0x13, 0xcf, 0x0e, 0x1e, 0x6e, 0xff, 0x83, 0x5c,
0xe9, 0xce, 0x4c, 0x30, 0x9b, 0x6a, 0x28, 0xc8, 0x8b, 0xa8, 0xa1, 0xfb, 0xf3, 0x7a, 0xff, 0x64,
0xf3, 0xfa, 0xa5, 0x4a, 0xfa, 0xc0, 0x32, 0x4d, 0xf4, 0x3b, 0x28, 0x0e, 0x5c, 0xbc, 0x82, 0xf3,
0x6a, 0x36, 0xa8, 0xbf, 0x92, 0x8f, 0x6a, 0x29, 0x9e, 0x8d, 0x43, 0xb3, 0x4c, 0xcf, 0x83, 0xb6,
0x83, 0xa7, 0x4d, 0x67, 0xb4, 0xf7, 0x89, 0xab, 0x7e, 0xdb, 0x3c, 0x21, 0xf5, 0xb3, 0x73, 0x02,
0x1f, 0x20, 0xe6, 0x5d, 0xab, 0xbc, 0x92, 0x2a, 0x2f, 0x0b, 0x82, 0x69, 0xaf, 0x81, 0xbf, 0x6e,
0x49, 0xcb, 0x34, 0x01, 0x98, 0xe7, 0x2d, 0x80, 0x35, 0x4a, 0x00, 0xa6, 0xe6, 0xb4, 0x7c, 0xe1,
0xb0, 0xbf, 0x5c, 0xa6, 0x47, 0x17, 0x86, 0x4b, 0x53, 0xa5, 0xbe, 0xb4, 0xc3, 0xf3, 0xa5, 0x8d,
0xa0, 0x97, 0xd6, 0x65, 0xef, 0x09, 0x66, 0x39, 0xa0, 0x3c, 0xe1, 0x25, 0x7c, 0xf4, 0xd2, 0x38,
0x0f, 0xe3, 0xe8, 0xad, 0x06, 0xc5, 0x23, 0xf8, 0xc9, 0x82, 0x1f, 0xab, 0xf1, 0x3c, 0x0d, 0x84,
0x20, 0xa0, 0xe9, 0x49, 0xb8, 0xd4, 0x43, 0xef, 0x6c, 0x80, 0x40, 0x29, 0x92, 0x76, 0xbb, 0xc6,
0xb4, 0x47, 0xc0, 0x77, 0xe3, 0x8f, 0xd5, 0x22, 0xa4, 0x91, 0xd9, 0x45, 0x20, 0xba, 0x5f, 0x48,
0xa6, 0x06, 0x6f, 0x16, 0x68, 0x09, 0xc6, 0x60, 0x7a, 0x3b, 0x45, 0xd9, 0xb1, 0x15, 0x00, 0x81,
0xe8, 0x41, 0x6b, 0x95, 0xcc, 0x69, 0xdf, 0xc9, 0xd3, 0x7a, 0xe7, 0x7c, 0x2f, 0xdf, 0x2f, 0x1d,
0xad, 0x4e, 0xfd, 0x9c, 0xc0, 0x83, 0x49, 0x0f, 0x08, 0x34, 0x7b, 0x04, 0xd0, 0xd4, 0x95, 0x8d,
0xaa, 0x2a, 0x0a, 0x14, 0x57, 0x24, 0xf0, 0xf5, 0xe7, 0x6c, 0x3e, 0x6f, 0x3e, 0x48, 0x3f, 0xbf,
0xfa, 0xb2, 0xa4, 0xa5, 0x38, 0x30, 0xc0, 0x5b, 0x98, 0xd9, 0xa1, 0x16, 0x32, 0xdc, 0x83, 0x9d,
0xbd, 0x79, 0x8d, 0xa3, 0x26, 0x84, 0xd1, 0xda, 0x84, 0x51, 0xc7, 0x63, 0x30, 0x26, 0x7a, 0xec,
0x22, 0xf1, 0xc6, 0x49, 0x4e, 0x53, 0x2b, 0xa0, 0x12, 0x37, 0x36, 0xf7, 0x67, 0x68, 0x50, 0xb4,
0x46, 0xec, 0x3b, 0x79, 0x4b, 0xae, 0xb0, 0xd8, 0xea, 0xb2, 0xaa, 0x72, 0x83, 0xc2, 0xf5, 0xf9,
0xa1, 0x54, 0x95, 0xdd, 0xed, 0x12, 0x61, 0xa5, 0x43, 0x1e, 0xf4, 0xab, 0xd8, 0x34, 0xe9, 0xf2,
0x1e, 0xa9, 0xf8, 0xe2, 0x4c, 0xa2, 0xdc, 0xc4, 0xb0, 0xd3, 0xd7, 0x16, 0x39, 0x5f, 0xe6, 0x89,
0xc8, 0xb5, 0xb2, 0x1d, 0x5e, 0x73, 0x31, 0xf0, 0xc1, 0x2b, 0x2a, 0xec, 0x59, 0x12, 0xbd, 0xbe,
0x9c, 0xae, 0x8d, 0x9e, 0xc4, 0xd0, 0x6d, 0x40, 0x8c, 0x0e, 0x6b, 0xd0, 0xac, 0xe4, 0x33, 0xf6,
0x6f, 0x6f, 0xee, 0x40, 0x01, 0x67, 0xb4, 0xb3, 0x0f, 0x6c, 0x18, 0x6d, 0xd2, 0xd4, 0x06, 0x60,
0xd3, 0x68, 0x69, 0x52, 0x3b, 0x88, 0x0a, 0x6c, 0x19, 0xed, 0x52, 0xee, 0xcf, 0x33, 0xdb, 0xfc,
0x78, 0x66, 0x87, 0x8e, 0xde, 0x10, 0x0b, 0xb3, 0x6c, 0x30, 0x33, 0xbb, 0x7c, 0x54, 0x88, 0xfe,
0x38, 0x29, 0x0a, 0x08, 0x8d, 0x76, 0x62, 0x2b, 0xb0, 0x5a, 0xb9, 0xa9, 0xe5, 0xdd, 0x62, 0x03,
0xd2, 0x49, 0x16, 0x87, 0x13, 0xbf, 0x78, 0xfe, 0x45, 0xff, 0x6b, 0x2c, 0xb3, 0xb4, 0x43, 0x58,
0x87, 0x03, 0x6d, 0x89, 0xcd, 0x3a, 0xbf, 0xfd, 0xc6, 0xf9, 0xb7, 0x7f, 0xf1, 0x26, 0x0d, 0x2d,
0xb5, 0x2f, 0xd5, 0xa3, 0xd6, 0x92, 0x81, 0xad, 0x4f, 0x1d, 0xf9, 0x6e, 0x49, 0x86, 0x33, 0x18,
0xfa, 0x33, 0xf0, 0x6e, 0x12, 0x8d, 0xd9, 0xff, 0x9d, 0x2c, 0x92, 0xcf, 0xdc, 0x6e, 0x6e, 0xbe,
0xf8, 0x5b, 0x0a, 0x43, 0x22, 0x03, 0x0d, 0x9c, 0x1a, 0x70, 0x82, 0xda, 0x3c, 0xd6, 0xe3, 0x16,
0x38, 0xdf, 0x60, 0x30, 0xc9, 0x33, 0xc1, 0xe7, 0x14, 0x73, 0xab, 0xcc, 0xc7, 0x14, 0x8b, 0x37,
0xa7, 0x7c, 0xd1, 0x77, 0x4d, 0xb4, 0x39, 0xd5, 0x72, 0x73, 0x9b, 0x5a, 0x77, 0x4e, 0x4b, 0x0a,
0x9e, 0x58, 0x37, 0xb7, 0xdd, 0xb5, 0xc3, 0x53, 0x96, 0xf4, 0x2d, 0x8c, 0x07, 0x26, 0xd5, 0x4a,
0xfe, 0x00, 0x87, 0x80, 0x86, 0x76, 0x5b, 0x02, 0xb7, 0xf7, 0x89, 0x6b, 0x18, 0xd7, 0x5b, 0xc7,
0x63, 0xc5, 0x9f, 0x3b, 0x12, 0xc6, 0xdf, 0x3b, 0x8e, 0x83, 0x8a, 0xb5, 0x13, 0xc6, 0xc9, 0xf8,
0x60, 0x4e, 0x6d, 0x2d, 0x88, 0x32, 0x8c, 0x43, 0x86, 0x76, 0x5c, 0x32, 0xdf, 0x10, 0xcd, 0xdc,
0xcd, 0x8b, 0x4d, 0x9b, 0x17, 0xb3, 0xfc, 0x0b, 0x69, 0x7c, 0x27, 0xa2, 0xa9, 0x9e, 0x26, 0x54,
0xd8, 0x8b, 0x69, 0x4e, 0xdd, 0xff, 0xef, 0x5a, 0x52, 0xfd, 0x14, 0x4d, 0x33, 0x9b, 0xfd, 0x01,
0xd5, 0x62, 0xd5, 0x3f, 0x49, 0xc9, 0x22, 0x82, 0xab, 0x60, 0x19, 0x1d, 0x17, 0xd8, 0x79, 0x60,
0xaa, 0xe6, 0x84, 0x87, 0x91, 0x1a, 0x8b, 0x9f, 0xd5, 0xbe, 0x0a, 0xcd, 0x37, 0xe3, 0xb7, 0x57,
0x4d, 0x19, 0x56, 0x26, 0xff, 0xf7, 0xd1, 0xd2, 0x3a, 0x69, 0x7b, 0x2c, 0x89, 0xfc, 0x91, 0x7a,
0xd2, 0x3a, 0xb9, 0xc3, 0x60, 0x99, 0x16, 0x9a, 0x85, 0x5c, 0x28, 0xd0, 0x23, 0x6c, 0x77, 0xbc,
0xab, 0x98, 0x7d, 0xb6, 0xa2, 0x0d, 0x00, 0x03, 0x81, 0xe4, 0xfa, 0x7e, 0x5d, 0xb6, 0xbb, 0x81,
0x64, 0xb8, 0x52, 0x96, 0x75, 0x08, 0xf8, 0x63, 0x63, 0x52, 0xb5, 0xaa, 0xff, 0xd5, 0xc2, 0x63,
0x19, 0xda, 0xa1, 0x61, 0x9c, 0xd9, 0x51, 0xb3, 0x41, 0xd6, 0x89, 0xac, 0x38, 0xed, 0xfd, 0x68,
0xe6, 0x69, 0x56, 0x9b, 0xc1, 0xe7, 0x77, 0x9d, 0x3f, 0xc3, 0x60, 0x64, 0x9c, 0xe3, 0xcd, 0x70,
0x33, 0xab, 0x6e, 0x4b, 0x82, 0x28, 0x23, 0x7d, 0xb7, 0x84, 0x35, 0x7e, 0x27, 0x87, 0xed, 0x6d,
0xad, 0x48, 0x6d, 0x67, 0xa2, 0x55, 0xca, 0x29, 0x8c, 0x8b, 0x12, 0x0f, 0x5a, 0x5d, 0xf9, 0xc6,
0x7e, 0xe4, 0x0d, 0xb2, 0xab, 0x0c, 0xf2, 0x99, 0xa3, 0x48, 0x07, 0x1e, 0x8c, 0x92, 0xb9, 0x84,
0xd3, 0xa2, 0x9d, 0x46, 0x0b, 0x3f, 0xbf, 0x54, 0x09, 0xee, 0xfa, 0x6b, 0xbb, 0x48, 0xb6, 0x82,
0xd1, 0xdb, 0xd3, 0xf0, 0xea, 0xc9, 0x91, 0x67, 0xfa, 0x9f, 0xc7, 0xf3, 0x47, 0xfa, 0x02, 0xff,
0x92, 0xed, 0x6d, 0x67, 0xfc, 0xe3, 0xb8, 0x70, 0x6e, 0x35, 0x2e, 0x64, 0x36, 0x6e, 0x88, 0x7f,
0xb7, 0x15, 0xf3, 0xd5, 0xfe, 0xd2, 0x0c, 0x23, 0xa6, 0xa6, 0x3c, 0xf0, 0x3f, 0x17, 0x46, 0xcd,
0x89, 0x91, 0x25, 0x07, 0xae, 0xa6, 0xee, 0x0d, 0x73, 0x6f, 0xd4, 0xb5, 0xad, 0xf3, 0xef, 0xf2,
0xf4, 0x19, 0xd8, 0x71, 0x3c, 0xfd, 0xc8, 0x7e, 0xca, 0xe4, 0xb5, 0xf2, 0xef, 0x1b, 0x7d, 0x30,
0xfe, 0x5e, 0x7a, 0xbf, 0x3c, 0xe6, 0x9e, 0xdd, 0x24, 0x26, 0x3c, 0x7a, 0xbb, 0x69, 0xf3, 0xc5,
0x13, 0xc5, 0xea, 0x3a, 0x94, 0x67, 0x23, 0x25, 0xe6, 0x23, 0x3e, 0xa0, 0x4d, 0x85, 0xc9, 0xdb,
0x68, 0x09, 0x27, 0x17, 0x38, 0x3d, 0xa9, 0x0a, 0xf2, 0xc5, 0xcd, 0x4f, 0xa9, 0xf8, 0xc1, 0x5f,
0xac, 0xcf, 0x3f, 0x0f, 0xd3, 0xa4, 0x5e, 0x73, 0xce, 0xcb, 0xee, 0xbf, 0x5a, 0x9e, 0xe6, 0xe1,
0xd1, 0xe7, 0x7d, 0x17, 0x2a, 0x94, 0xb9, 0x0f, 0x6d, 0x7a, 0x88, 0x2e, 0x8c, 0x6e, 0xf8, 0x84,
0xc9, 0x8a, 0xc7, 0x63, 0xf5, 0x9a, 0x1e, 0x9b, 0xae, 0xa2, 0xa0, 0x90, 0x95, 0x5a, 0xf6, 0x05,
0xbf, 0x65, 0xc5, 0xb1, 0x42, 0x12, 0x32, 0xc7, 0xfb, 0xed, 0x5e, 0xaa, 0xf1, 0x3e, 0x22, 0x2a,
0x78, 0xa1, 0xa3, 0xb7, 0x5a, 0xbc, 0x39, 0xe3, 0xf9, 0xdc, 0xe9, 0x33, 0x7b, 0xb1, 0x40, 0x35,
0x8d, 0x84, 0xa3, 0xa0, 0xb8, 0x8a, 0xbc, 0xbd, 0xe0, 0xaf, 0xbf, 0x13, 0x83, 0x79, 0x0a, 0x1b,
0x1e, 0x22, 0xa9, 0xc5, 0xda, 0x25, 0x91, 0xe6, 0xa4, 0xac, 0xe0, 0x63, 0x60, 0x75, 0x87, 0xcd,
0xa5, 0x04, 0x2b, 0x20, 0x51, 0x42, 0xb3, 0x3e, 0x2a, 0xda, 0x6c, 0x21, 0xd1, 0x8b, 0x43, 0xf9,
0x2b, 0x9a, 0xdd, 0x62, 0x97, 0x4d, 0xf0, 0xd3, 0x71, 0x26, 0xe4, 0x87, 0x48, 0xe3, 0x37, 0xdf,
0x63, 0xc4, 0x92, 0xde, 0x0d, 0x19, 0x3f, 0x17, 0xed, 0x5b, 0xc5, 0x37, 0xb5, 0x57, 0xc7, 0x7b,
0x5e, 0x2a, 0x68, 0x11, 0xb9, 0xa5, 0x1b, 0x06, 0x79, 0x01, 0x6a, 0x13, 0xa4, 0x89, 0x81, 0xf8,
0x93, 0xd8, 0xf1, 0xac, 0x2a, 0xd2, 0xaf, 0x76, 0x5f, 0xd4, 0x15, 0xde, 0xce, 0x9a, 0x90, 0x62,
0x45, 0xdf, 0xed, 0x9a, 0xf0, 0x5d, 0x0a, 0x16, 0x7d, 0xc5, 0x8a, 0xf0, 0x15, 0x25, 0x8b, 0xbe,
0x42, 0x3d, 0x7c, 0x35, 0xff, 0xf4, 0x5d, 0xc0, 0x65, 0x35, 0x58, 0x23, 0x16, 0xf0, 0x90, 0xfe,
0x38, 0x29, 0x07, 0x3f, 0x1e, 0x8e, 0xb3, 0x4a, 0xdf, 0x6a, 0x76, 0x5d, 0x47, 0x9e, 0x61, 0x78,
0x0e, 0x97, 0xd1, 0x8d, 0x6e, 0x07, 0xd1, 0xd5, 0x73, 0x2d, 0xcf, 0x24, 0xe6, 0x37, 0x9d, 0x78,
0x1b, 0xbc, 0xdc, 0xed, 0x30, 0x11, 0xbe, 0x9d, 0x27, 0x9c, 0x74, 0x3b, 0x4c, 0x6e, 0xf3, 0x91,
0xcf, 0x14, 0x8e, 0xda, 0x18, 0xd4, 0x92, 0x81, 0xe5, 0x38, 0x44, 0xf8, 0xd0, 0x1f, 0x16, 0x7c,
0x0a, 0xbd, 0x46, 0x90, 0x71, 0xe3, 0xa4, 0x8f, 0x28, 0x4a, 0x75, 0xfd, 0x07, 0xc3, 0xb0, 0xb7,
0xb1, 0x84, 0x27, 0xc3, 0xec, 0x3c, 0xaa, 0xe3, 0xa0, 0xab, 0x2f, 0x87, 0x30, 0x5b, 0xe2, 0xf8,
0x22, 0x49, 0x4c, 0x3e, 0x98, 0xaf, 0xdd, 0xbd, 0x2b, 0x9f, 0xd5, 0x85, 0x0d, 0x60, 0x78, 0xc7,
0x02, 0x30, 0xe5, 0xb3, 0x92, 0xf0, 0x4d, 0xbd, 0x35, 0xaa, 0xac, 0xf2, 0xe2, 0x6a, 0x42, 0x04,
0xa3, 0x4d, 0xef, 0x4b, 0xd6, 0x47, 0x1f, 0x05, 0x2a, 0xcf, 0x42, 0xbd, 0x9a, 0x49, 0x6f, 0xea,
0x21, 0x3e, 0x45, 0xa1, 0x85, 0xab, 0x48, 0x57, 0x38, 0x8c, 0x9d, 0xef, 0x7a, 0x82, 0x1e, 0x58,
0x37, 0x53, 0x72, 0xf9, 0x05, 0x50, 0x13, 0xc9, 0x73, 0xf6, 0xd7, 0xe9, 0xcd, 0x08, 0xe2, 0x44,
0x67, 0x00, 0xbb, 0x9d, 0xcf, 0xb5, 0xef, 0x0a, 0xb6, 0xc6, 0x4d, 0x29, 0x98, 0xa3, 0xdd, 0x6d,
0x88, 0x49, 0xb9, 0xe1, 0x65, 0x8d, 0xf1, 0x4e, 0x64, 0x41, 0xe0, 0x0a, 0x30, 0x7f, 0x80, 0x7e,
0x32, 0xd5, 0x58, 0x41, 0x08, 0x22, 0x2c, 0x40, 0x7c, 0x6a, 0x26, 0xc8, 0xe2, 0x0e, 0x04, 0xe3,
0xc4, 0xfb, 0x2f, 0x08, 0x78, 0x59, 0x5e, 0xe8, 0x4f, 0x7d, 0x8f, 0x27, 0xd9, 0x8e, 0x84, 0x24,
0x24, 0xd1, 0x27, 0xc6, 0x5b, 0xa6, 0x78, 0x32, 0x95, 0x9c, 0xa8, 0xc9, 0x31, 0x96, 0xf7, 0xb2,
0xfe, 0x92, 0x7c, 0x96, 0x21, 0xda, 0x2f, 0xfb, 0xe1, 0x27, 0xb9, 0x7e, 0x05, 0xd5, 0x38, 0x3c,
0x99, 0x7c, 0x72, 0x6d, 0xb0, 0x74, 0x18, 0x3c, 0x2b, 0x83, 0x59, 0xda, 0x82, 0x8b, 0x45, 0xe2,
0x33, 0x97, 0xb6, 0xac, 0x93, 0x5b, 0x84, 0xb6, 0x9c, 0x5a, 0xc7, 0x90, 0xaa, 0x81, 0x6c, 0x68,
0x56, 0x35, 0x33, 0x7d, 0x97, 0x0d, 0xab, 0x94, 0x54, 0x97, 0xbf, 0x66, 0x41, 0xf7, 0x07, 0x1d,
0xe7, 0x8d, 0x95, 0x22, 0x36, 0xea, 0x93, 0x86, 0xbd, 0x20, 0x5d, 0x1c, 0xf0, 0x8a, 0xc1, 0xc4,
0x50, 0x5e, 0x1f, 0x87, 0x7d, 0x13, 0x0e, 0x82, 0xed, 0x64, 0x81, 0x06, 0x5a, 0x95, 0xe0, 0x6c,
0x04, 0x2c, 0x43, 0xb6, 0x19, 0x2a, 0xe1, 0x5d, 0x8c, 0xdb, 0x9c, 0xc1, 0x79, 0x7b, 0x0c, 0x52,
0x8c, 0xbf, 0x2c, 0x59, 0xbf, 0x98, 0x34, 0x55, 0xdf, 0x62, 0x10, 0xcc, 0x75, 0x0d, 0x74, 0x1d,
0x4f, 0x2d, 0x7d, 0xfc, 0xc6, 0xb1, 0xe0, 0x86, 0x3b, 0xfc, 0xc8, 0x95, 0x5b, 0x8d, 0xc2, 0xfc,
0x4c, 0x78, 0x35, 0x43, 0x2d, 0xd6, 0x07, 0x04, 0xeb, 0x78, 0x0c, 0x8c, 0x11, 0xca, 0x78, 0xcb,
0x49, 0x5c, 0xba, 0xf9, 0xc4, 0x06, 0x30, 0xef, 0xfe, 0x2f, 0x55, 0xee, 0xcd, 0x07, 0xc7, 0x58,
0xf1, 0x5c, 0x42, 0x54, 0xb7, 0x22, 0xdc, 0xe6, 0x30, 0x70, 0xce, 0xa1, 0x39, 0xbb, 0x6d, 0x07,
0x81, 0x8f, 0x20, 0xa6, 0x99, 0x98, 0xbc, 0xc0, 0x79, 0x1a, 0x61, 0xb3, 0x54, 0x0b, 0xcc, 0xc5,
0xb9, 0x67, 0x8f, 0x6c, 0x73, 0x31, 0x87, 0x2a, 0xb5, 0x05, 0xfe, 0x80, 0x1c, 0xc5, 0xea, 0xea,
0xa1, 0x0e, 0x64, 0xf2, 0x6b, 0x61, 0x71, 0xd0, 0x9e, 0x55, 0x33, 0xc2, 0x7c, 0xdc, 0x14, 0xbe,
0xd2, 0x61, 0x08, 0x38, 0x55, 0xce, 0x94, 0xf8, 0x18, 0xdc, 0x2a, 0x80, 0x7e, 0x90, 0x34, 0x4d,
0x6c, 0xe5, 0xa2, 0x08, 0x45, 0x12, 0xce, 0x19, 0x80, 0x91, 0x25, 0xa4, 0x10, 0x2f, 0xdb, 0x88,
0xb4, 0x8b, 0xd6, 0x57, 0x4e, 0x09, 0x38, 0xf3, 0xe9, 0x95, 0x88, 0x6f, 0x8d, 0xe4, 0xab, 0xd2,
0xb9, 0x1b, 0xc1, 0xa4, 0x49, 0x65, 0x67, 0x81, 0x1e, 0xa0, 0x65, 0x66, 0xa0, 0xa1, 0x5f, 0x5d,
0xee, 0x7d, 0x3e, 0x4e, 0xe6, 0x6a, 0xcd, 0x6c, 0x7b, 0x7c, 0x8e, 0x3a, 0x62, 0x51, 0x3a, 0xc1,
0x70, 0xb3, 0x9e, 0x09, 0x7c, 0x90, 0x4b, 0x4f, 0x3c, 0x78, 0x5b, 0x24, 0x25, 0x74, 0xb2, 0x92,
0x27, 0x8f, 0x1f, 0x9d, 0x2d, 0x1b, 0x25, 0xe2, 0x70, 0x4d, 0xa2, 0x57, 0x03, 0xa5, 0xcb, 0xe8,
0x5c, 0xbf, 0x95, 0xb8, 0x1a, 0xc4, 0xad, 0x0f, 0x69, 0xab, 0x11, 0xb6, 0xea, 0xc4, 0x5c, 0x1b,
0x2d, 0xdc, 0x7c, 0x06, 0xd6, 0x2f, 0xa3, 0x0e, 0xd4, 0xaa, 0x74, 0x68, 0xf4, 0xd1, 0x43, 0x25,
0xa1, 0x11, 0x9f, 0x28, 0xc5, 0x1e, 0x42, 0xe0, 0x33, 0xff, 0x90, 0x31, 0xc6, 0x0f, 0xd2, 0x2f,
0x5e, 0xf8, 0xf4, 0x94, 0xee, 0xfa, 0x47, 0xb3, 0xef, 0x21, 0x9b, 0xed, 0x78, 0x30, 0x3d, 0x5b,
0x7c, 0xa5, 0x13, 0x59, 0x25, 0xd8, 0xef, 0x8a, 0x10, 0x62, 0xd8, 0x49, 0xcf, 0xc8, 0x07, 0x5f,
0x49, 0x9b, 0x74, 0x37, 0x61, 0x25, 0xda, 0x94, 0x6c, 0xb0, 0x05, 0x76, 0x97, 0x71, 0x52, 0x94,
0x88, 0x84, 0x24, 0xfe, 0xa5, 0x82, 0x46, 0x4b, 0x9a, 0x6d, 0x0a, 0xc7, 0x30, 0xd8, 0x37, 0x33,
0x0e, 0xf6, 0xf8, 0x15, 0x0c, 0xcd, 0x5c, 0x34, 0x88, 0x93, 0x8f, 0x62, 0xf3, 0x69, 0x5f, 0x82,
0xcb, 0x8e, 0x8c, 0x1b, 0xf2, 0xdb, 0xf5, 0x3d, 0xcd, 0x7d, 0xda, 0x3a, 0x3e, 0x4c, 0x68, 0xdd,
0x75, 0x78, 0x61, 0xbe, 0x6d, 0x6b, 0x81, 0x44, 0xf7, 0xc8, 0xca, 0x0e, 0x8c, 0x6a, 0x3c, 0x6b,
0x90, 0x08, 0xd4, 0x9c, 0xcf, 0x9e, 0xca, 0x8d, 0xb0, 0x96, 0x97, 0xc0, 0xc9, 0x64, 0xb1, 0x6f,
0x1a, 0x88, 0x72, 0x96, 0xa0, 0x71, 0x16, 0x00, 0x69, 0x16, 0xf4, 0xc4, 0x67, 0x31, 0xcf, 0xd3,
0x7e, 0x5f, 0x0a, 0x0f, 0x16, 0xe3, 0x94, 0xc0, 0x43, 0xc4, 0x11, 0xa4, 0x07, 0x2a, 0xa7, 0x2d,
0xc5, 0x27, 0xa4, 0xa3, 0xab, 0xaf, 0xed, 0x96, 0xdc, 0x65, 0xfd, 0x33, 0x20, 0x64, 0x93, 0x8d,
0xdf, 0xd0, 0xfa, 0xe6, 0xb9, 0x75, 0x0c, 0x53, 0xc6, 0x9f, 0x65, 0x70, 0xdd, 0x27, 0x4e, 0xd7,
0xe4, 0x45, 0x1a, 0x9e, 0x22, 0xac, 0x83, 0xc2, 0x8b, 0xb0, 0x5f, 0xe4, 0x87, 0x17, 0xed, 0x8f,
0x28, 0xd9, 0x1f, 0xc6, 0x56, 0xb5, 0x3b, 0xd3, 0x53, 0x5c, 0xbb, 0x96, 0x59, 0x48, 0x1b, 0x62,
0xeb, 0x1f, 0x51, 0x0c, 0xab, 0x86, 0xf4, 0x5f, 0x0d, 0x2e, 0x15, 0x8f, 0xc4, 0xa3, 0x5d, 0x18,
0x6b, 0x7d, 0x2d, 0x1c, 0x4c, 0x1f, 0x21, 0x26, 0x9d, 0x27, 0x16, 0xb6, 0x34, 0x98, 0x0b, 0xd7,
0xe6, 0xab, 0xa2, 0xd5, 0xbe, 0x0c, 0x57, 0x86, 0x20, 0xee, 0xbf, 0x6f, 0xeb, 0x88, 0x31, 0xda,
0x7b, 0x00, 0x7c, 0x90, 0x1f, 0x67, 0x64, 0x0c, 0x1f, 0x10, 0xb8, 0x29, 0x33, 0x1e, 0x7e, 0xed,
0x36, 0x75, 0xbd, 0x2d, 0x9c, 0x44, 0x8d, 0x92, 0x9c, 0xb1, 0xd6, 0xae, 0x07, 0x5e, 0x6a, 0xba,
0x00, 0xbb, 0x3a, 0x54, 0x20, 0xe2, 0x03, 0x00, 0xc1, 0x2f, 0x10, 0xee, 0xee, 0x45, 0x09, 0xa0,
0xf1, 0xed, 0x3a, 0x87, 0x2d, 0xe3, 0xb0, 0x4f, 0x3d, 0x52, 0xd2, 0x8d, 0x95, 0x17, 0x99, 0xb7,
0xe8, 0x15, 0x12, 0x71, 0x1e, 0x7b, 0x6e, 0xb3, 0xec, 0xd3, 0x0a, 0xa9, 0x18, 0x32, 0xc9, 0x25,
0x74, 0x52, 0xe4, 0x6b, 0x1e, 0x9f, 0x16, 0xf9, 0x62, 0x75, 0x9a, 0x91, 0xb8, 0x60, 0xda, 0x2a,
0x5b, 0xea, 0xb5, 0xec, 0x27, 0xa5, 0x60, 0xd3, 0x33, 0x05, 0x69, 0x0e, 0x1a, 0x57, 0xeb, 0x79,
0xc2, 0x5d, 0x1e, 0x08, 0xf5, 0x75, 0xac, 0x54, 0x96, 0x04, 0xe4, 0xfa, 0x2a, 0x1d, 0xe6, 0x1e,
0x3b, 0xab, 0x83, 0xb3, 0x55, 0x24, 0x18, 0x99, 0xd4, 0x3c, 0xad, 0xd6, 0x2c, 0x2a, 0xd4, 0xd1,
0x95, 0x5f, 0x0e, 0x23, 0x9a, 0xb0, 0xcd, 0x91, 0x4d, 0x9a, 0x20, 0x5b, 0xc2, 0xe3, 0x3a, 0xbb,
0x4b, 0x12, 0x9f, 0xa2, 0x52, 0xc2, 0x18, 0xc4, 0xc8, 0xb0, 0x6d, 0x56, 0x8a, 0xde, 0x52, 0x15,
};
const unsigned int html_content_br_len = 6653;
const unsigned int html_content_br_len = 9120;
#endif // HTML_CONTENT_BR_H

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -829,10 +829,7 @@ bool server_running = false;
static bool s_wifi_running = false;
static esp_netif_t *s_ap_netif = NULL;
static esp_netif_t *s_sta_netif = NULL;
static bool s_wifi_initted = false;
static SemaphoreHandle_t s_sta_sem = NULL;
static bool s_sta_connected = false;
static esp_err_t start_http_server(void) {
if (server_running) return ESP_OK;
@@ -908,15 +905,7 @@ static void wifi_event_handler(void* arg, esp_event_base_t event_base,
ESP_LOGI(TAG, "Station disconnected, AID=%d", event->aid);
n_connected--;
if (n_connected <= 0) stop_http_server();
} else if (event_id == WIFI_EVENT_STA_DISCONNECTED) {
s_sta_connected = false;
if (s_sta_sem) xSemaphoreGive(s_sta_sem);
}
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t *e = (ip_event_got_ip_t *)event_data;
ESP_LOGI(TAG, "STA connected, IP: " IPSTR, IP2STR(&e->ip_info.ip));
s_sta_connected = true;
if (s_sta_sem) xSemaphoreGive(s_sta_sem);
}
}
@@ -950,83 +939,10 @@ static esp_err_t wifi_common_init(void) {
return err;
}
err = esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
&wifi_event_handler, NULL, NULL);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to register IP_EVENT handler: %s", esp_err_to_name(err));
return err;
}
s_wifi_initted = true;
return ESP_OK;
}
/* Attempt STA connection; blocks up to 10 s. Returns ESP_OK on GOT_IP. */
static esp_err_t try_connect_sta(const char *ssid, const char *pass, bool reset_wdt) {
if (s_sta_netif == NULL) {
s_sta_netif = esp_netif_create_default_wifi_sta();
if (s_sta_netif == NULL) {
ESP_LOGE(TAG, "Failed to create STA netif");
return ESP_FAIL;
}
esp_netif_set_hostname(s_sta_netif, HOSTNAME);
}
esp_err_t err = wifi_common_init();
if (err != ESP_OK) return err;
wifi_config_t sta_cfg = {};
strlcpy((char *)sta_cfg.sta.ssid, ssid, sizeof(sta_cfg.sta.ssid));
strlcpy((char *)sta_cfg.sta.password, pass ? pass : "", sizeof(sta_cfg.sta.password));
err = esp_wifi_set_mode(WIFI_MODE_STA);
if (err != ESP_OK) { ESP_LOGE(TAG, "set_mode STA: %s", esp_err_to_name(err)); return err; }
err = esp_wifi_set_config(WIFI_IF_STA, &sta_cfg);
if (err != ESP_OK) { ESP_LOGE(TAG, "set_config STA: %s", esp_err_to_name(err)); return err; }
s_sta_connected = false;
if (s_sta_sem == NULL) {
s_sta_sem = xSemaphoreCreateBinary();
} else {
xSemaphoreTake(s_sta_sem, 0); // drain any stale token
}
err = esp_wifi_start();
if (err != ESP_OK) { ESP_LOGE(TAG, "wifi_start: %s", esp_err_to_name(err)); return err; }
/* Yield so the event loop (priority 20) can process WIFI_EVENT_STA_START
* and esp_netif can finish initialising the STA interface before we call
* esp_wifi_connect(). The esp_timer task runs at priority 22, so without
* this yield it would call connect before STA_START is handled — the
* driver accepts the call (returns ESP_OK) but silently discards it when
* it finishes its own internal start sequence. */
vTaskDelay(pdMS_TO_TICKS(10));
err = esp_wifi_connect();
if (err != ESP_OK) {
ESP_LOGE(TAG, "wifi_connect: %s", esp_err_to_name(err));
esp_wifi_stop();
return err;
}
/* Poll in 100 ms slices so the WDT gets reset when needed (init path). */
for (int i = 0; i < 100 && !s_sta_connected; i++) {
xSemaphoreTake(s_sta_sem, pdMS_TO_TICKS(100));
if (reset_wdt) esp_task_wdt_reset();
}
if (!s_sta_connected) {
ESP_LOGW(TAG, "STA connection timed out or rejected");
esp_wifi_stop();
return ESP_FAIL;
}
s_wifi_running = true;
if (comms_event_group) xEventGroupSetBits(comms_event_group, WIFI_READY_BIT);
return ESP_OK;
}
static esp_err_t launch_soft_ap(void) {
ESP_LOGI(TAG, "AP LAUNCHING");
@@ -1110,20 +1026,11 @@ static esp_err_t launch_soft_ap(void) {
return ESP_OK;
}
/* STA-first startup: try NET_SSID, fall back to softAP on failure/empty. */
/* TODO: STA mode disabled pending network stack fixes */
/* SoftAP-only startup. STA mode was removed along with try_connect_sta()
* — revisit if/when STA is reinstated (see git history for the previous
* implementation). */
static esp_err_t start_wifi(bool reset_wdt) {
// char *net_ssid = get_param_string(PARAM_NET_SSID);
// if (net_ssid && strlen(net_ssid) > 0) {
// char *net_pass = get_param_string(PARAM_NET_PASS);
// ESP_LOGI(TAG, "Trying STA connection to '%s'...", net_ssid);
// if (try_connect_sta(net_ssid, net_pass, reset_wdt) == ESP_OK) {
// ESP_LOGI(TAG, "STA connected — HTTP server running");
// return ESP_OK;
// }
// ESP_LOGW(TAG, "STA failed — falling back to softAP");
// /* try_connect_sta already called esp_wifi_stop() on failure */
// }
(void)reset_wdt;
return launch_soft_ap();
}
@@ -1144,17 +1051,14 @@ esp_err_t webserver_restart_wifi(void) {
if (s_wifi_running) {
esp_wifi_stop();
s_wifi_running = false;
/* Allow the event loop to drain the WIFI_EVENT_STA_DISCONNECTED (or
* AP stop) event that esp_wifi_stop() queues asynchronously. Without
* this delay, the stale disconnect event is processed after the new
* esp_wifi_connect() call, which resets the driver's internal
* connection state machine and silently kills the new attempt. */
/* Allow the event loop to drain the AP-stop event that
* esp_wifi_stop() queues asynchronously before we relaunch. */
vTaskDelay(pdMS_TO_TICKS(200));
}
esp_err_t err = start_wifi(false); // called from esp_timer task, not subscribed to WDT
if (err != ESP_OK) return err;
start_http_server(); // no-op if STA path already started it
start_http_server(); // no-op if already running
return ESP_OK;
}
@@ -1167,7 +1071,7 @@ esp_err_t webserver_init(void) {
return err;
}
start_http_server(); // no-op if STA path already started it
start_http_server(); // no-op if already running
ESP_LOGI(TAG, "Webserver initialization complete");
return ESP_OK;

View File

@@ -1 +0,0 @@
--ignore-dir=build

View File

@@ -1,17 +0,0 @@
--align-reference=name
--attach-classes
--attach-classes
--attach-namespaces
--convert-tabs
--exclude=build
--exclude=common
--exclude=managed_components
--ignore-exclude-errors
--indent-switches
--indent=spaces=4
--keep-one-line-statements
--max-continuation-indent=120
--pad-header
--pad-oper
--style=allman
--unpad-paren

View File

@@ -1,66 +0,0 @@
---
Language: Cpp
BasedOnStyle: WebKit
AlignConsecutiveMacros: true
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Always
AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: false
BeforeCatch: true
BeforeElse: true
BeforeLambdaBody: false
BeforeWhile: true
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: false
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
ColumnLimit: 200
CompactNamespaces: true
Cpp11BracedListStyle: false
FixNamespaceComments: true
IndentCaseLabels: true
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 1
NamespaceIndentation: Inner
PointerAlignment: Right
ReflowComments: true
SortIncludes: false
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeInheritanceColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: false
SpaceInEmptyParentheses: false
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
TabWidth: 4
UseTab: Never

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="org.eclipse.cdt.core.default.config.1304124771">
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1304124771" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
<externalSettings/>
<extensions/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
<pathentry excluding="**/CMakeFiles/**" kind="out" path="build"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

View File

@@ -1,28 +0,0 @@
---
name: esp_idf_lib_helpers
description: Common support library for esp-idf-lib
version: 1.4.0
groups:
- common
code_owners:
- trombik
- UncleRus
depends:
- freertos
thread_safe: n/a
targets:
- esp32
- esp8266
- esp32s2
- esp32c3
- esp32s3
- esp32c2
- esp32c6
- esp32h2
- esp32p4
- esp32c5
- esp32c61
license: ISC
copyrights:
- name: trombik
year: 2019

View File

@@ -1,12 +0,0 @@
examples/**/sdkconfig
examples/**/sdkconfig.old
examples/**/build/
examples/**/dependencies.lock
examples/**/managed_components/
docs/_*/
docs/**/*.log
*.swp
*.bak
*.orig
build/
.vscode/

View File

@@ -1,3 +0,0 @@
[submodule "common"]
path = common
url = https://github.com/esp-idf-lib/common.git

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>esp-idf-lib__esp_idf_lib_helpers</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.core.cBuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.cmake.core.cmakeNature</nature>
</natures>
</projectDescription>

View File

@@ -1,12 +0,0 @@
idf_component_register(
INCLUDE_DIRS .
REQUIRES freertos
)
# include common cmake file for components
set(ESP_IDF_LIB_CMAKE ${CMAKE_CURRENT_LIST_DIR}/common/cmake/esp-idf-lib.cmake)
if(EXISTS ${ESP_IDF_LIB_CMAKE})
include(${ESP_IDF_LIB_CMAKE})
else()
message(WARNING "${ESP_IDF_LIB_CMAKE} not found")
endif()

View File

@@ -1,13 +0,0 @@
Copyright (c) 2019 Tomoyuki Sakurai <y@trombik.org>
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@@ -1,30 +0,0 @@
# esp-idf-lib/esp_idf_lib_helpers
[![Build examples](https://github.com/esp-idf-lib/esp_idf_lib_helpers/actions/workflows//build.yml/badge.svg)](https://github.com/esp-idf-lib/esp_idf_lib_helpers/actions/workflows//build.yml)
[![Build docs](https://github.com/esp-idf-lib/esp_idf_lib_helpers/actions/workflows//build-docs.yml/badge.svg)](https://github.com/esp-idf-lib/esp_idf_lib_helpers/actions/workflows//build-docs.yml)
[![Validation](https://github.com/esp-idf-lib/esp_idf_lib_helpers/actions/workflows//validate-component.yml/badge.svg)](https://github.com/esp-idf-lib/esp_idf_lib_helpers/actions/workflows//validate-component.yml)
Common support library for esp-idf-lib.
* [Documentation](https://esp-idf-lib.github.io/esp_idf_lib_helpers/)
* [Repository](https://github.com/esp-idf-lib/esp_idf_lib_helpers)
* [Issues](https://github.com/esp-idf-lib/esp_idf_lib_helpers/issues)
* [Discussions and questions](https://github.com/esp-idf-lib/core/discussions)
* [Component page at the ESP Component Registry](https://components.espressif.com/components/esp-idf-lib/esp_idf_lib_helpers)
## Installation
```sh
idf.py add-dependency esp-idf-lib/esp_idf_lib_helpers
```
## Support
For questions and discussions about the component, please use
[Discussions](https://github.com/esp-idf-lib/core/discussions)
at [esp-idf-lib/core](https://github.com/esp-idf-lib/core).
## Contributing
Please read [CONTRIBUTING.md](https://github.com/esp-idf-lib/core/blob/main/CONTRIBUTING.md)
at [esp-idf-lib/core](https://github.com/esp-idf-lib/core).

View File

@@ -1,18 +0,0 @@
#!/usr/bin/env ruby
require "pathname"
require "yaml"
# A simple CLI to get values in .eil.yml
key = ARGV.shift
project_root = Pathname.new(File.expand_path(__FILE__)).parent.parent
eil_file = project_root / ".eil.yml"
doc = YAML.safe_load(File.read eil_file)
case key
when "copyright_string"
puts doc["copyrights"].map { |e| "#{e['year']}, #{e['name']}" }.join(", ")
else
puts doc[key]
end

View File

@@ -1,36 +0,0 @@
# Set common build flags but enable them only when the build is in our CI,
# making them optional. The idea is, fail when compiled in our CI but just
# warn in any other cases. Code that compiles with one toolchain warning-free
# may not do so with another toolchain, which creates a project dependency on
# specific toolchain vendors and versions.
#
# Define flags that may cause failures here.
if (DEFINED ENV{ESP_IDF_LIB_CI})
set(ESP_IDF_LIB_CI_FLAGS
-Werror=unused-variable
-Werror=unused-function
-Werror=write-strings
-Werror
)
endif()
# Set common build flags. Mandatory.
#
# Define flags that do not cause failures here.
set(ESP_IDF_LIB_FLAGS
-Wextra
-Wwrite-strings
-Wunused-variable
-Wunused-function
-Wreturn-type
)
# When COMPONENT_LIB is INTERFACE_LIBRARY, or a header-only library, do not
# set the flags.
get_target_property(COMPONENT_TYPE ${COMPONENT_LIB} TYPE)
if(NOT COMPONENT_TYPE STREQUAL "INTERFACE_LIBRARY")
target_compile_options(${COMPONENT_LIB} PRIVATE
${ESP_IDF_LIB_FLAGS}
${ESP_IDF_LIB_CI_FLAGS}
)
endif()

View File

@@ -1,8 +0,0 @@
COMPONENT_ADD_INCLUDEDIRS = .
ifdef CONFIG_IDF_TARGET_ESP8266
COMPONENT_DEPENDS = esp8266 freertos
else
COMPONENT_DEPENDS = freertos
endif

View File

@@ -1,101 +0,0 @@
/*
* Copyright (c) 2019 Tomoyuki Sakurai <y@trombik.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#if !defined(__ESP_IDF_LIB_HELPERS__H__)
#define __ESP_IDF_LIB_HELPERS__H__
/* XXX this header file does not need to include freertos/FreeRTOS.h.
* but without it, ESP8266 RTOS SDK does not include `sdkconfig.h` in correct
* order. as this header depends on sdkconfig.h, sdkconfig.h must be included
* first. however, the SDK includes this header first, then includes
* `sdkconfig.h` when freertos/FreeRTOS.h is not explicitly included. an
* evidence can be found in `build/${COMPONENT}/${COMPONENT}.d` in a failed
* build.
*/
#include <freertos/FreeRTOS.h>
#include <esp_idf_version.h>
#if !defined(ESP_IDF_VERSION) || !defined(ESP_IDF_VERSION_VAL)
#error Unknown ESP-IDF/ESP8266 RTOS SDK version
#endif
/* Minimal supported version for ESP32, ESP32S2 */
#define HELPER_ESP32_MIN_VER ESP_IDF_VERSION_VAL(3, 3, 5)
/* Minimal supported version for ESP8266 */
#define HELPER_ESP8266_MIN_VER ESP_IDF_VERSION_VAL(3, 3, 0)
/* HELPER_TARGET_IS_ESP32
* 1 when the target is esp32
*/
#if defined(CONFIG_IDF_TARGET_ESP32) \
|| defined(CONFIG_IDF_TARGET_ESP32S2) \
|| defined(CONFIG_IDF_TARGET_ESP32S3) \
|| defined(CONFIG_IDF_TARGET_ESP32C2) \
|| defined(CONFIG_IDF_TARGET_ESP32C3) \
|| defined(CONFIG_IDF_TARGET_ESP32C5) \
|| defined(CONFIG_IDF_TARGET_ESP32C6) \
|| defined(CONFIG_IDF_TARGET_ESP32P4) \
|| defined(CONFIG_IDF_TARGET_ESP32C61) \
|| defined(CONFIG_IDF_TARGET_ESP32H2)
#define HELPER_TARGET_IS_ESP32 (1)
/* HELPER_TARGET_IS_ESP8266
* 1 when the target is esp8266
*/
#elif defined(CONFIG_IDF_TARGET_ESP8266)
#define HELPER_TARGET_IS_ESP8266 (1)
#else
#error BUG: cannot determine the target
#endif
#if HELPER_TARGET_IS_ESP32 && ESP_IDF_VERSION < HELPER_ESP32_MIN_VER
#error Unsupported ESP-IDF version. Please update!
#endif
#if HELPER_TARGET_IS_ESP8266 && ESP_IDF_VERSION < HELPER_ESP8266_MIN_VER
#error Unsupported ESP8266 RTOS SDK version. Please update!
#endif
/* HELPER_SPI_HOST_DEFAULT
*
* The default SPI_HOST for spi_host_device_t
*/
#if CONFIG_IDF_TARGET_ESP32
#define HELPER_SPI_HOST_DEFAULT SPI1_HOST
#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
#define HELPER_SPI_HOST_DEFAULT SPI2_HOST
#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C61
#define HELPER_SPI_HOST_DEFAULT SPI1_HOST
#elif CONFIG_IDF_TARGET_ESP32H2
#define HELPER_SPI_HOST_DEFAULT SPI1_HOST
#elif CONFIG_IDF_TARGET_ESP32P4
#define HELPER_SPI_HOST_DEFAULT SPI1_HOST
#endif
/* show the actual values for debugging */
#if DEBUG
#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "=" VALUE(var)
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP32C3))
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP32H2))
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP32S2))
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP32))
#pragma message(VAR_NAME_VALUE(CONFIG_IDF_TARGET_ESP8266))
#pragma message(VAR_NAME_VALUE(ESP_IDF_VERSION_MAJOR))
#endif
#endif

View File

@@ -1,27 +0,0 @@
#if CONFIG_IDF_TARGET_ESP32
#include <esp32/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32C2
#include <esp32c2/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32C3
#include <esp32c3/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32C5
#include <esp32c5/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32C6
#include <esp32c6/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32C61
#include <esp32c61/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32H2
#include <esp32h2/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32H4
#include <esp32h4/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32S2
#include <esp32s2/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32S3
#include <esp32s3/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP32P4
#include <esp32p4/rom/ets_sys.h>
#elif CONFIG_IDF_TARGET_ESP8266
#include <rom/ets_sys.h>
#else
#error "ets_sys: Unknown target"
#endif

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="org.eclipse.cdt.core.default.config.352877361">
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.352877361" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
<externalSettings/>
<extensions/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
<pathentry excluding="**/CMakeFiles/**" kind="out" path="build"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>esp-idf-lib__esp_idf_lib_helpers_examples_default</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.core.cBuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.cmake.core.cmakeNature</nature>
</natures>
</projectDescription>

View File

@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(example_example)

View File

@@ -1,5 +0,0 @@
#V := 1
PROJECT_NAME := example_example
include $(IDF_PATH)/make/project.mk

View File

@@ -1,16 +0,0 @@
# Example application for `example` component
## What the example does
The example does nothing but waits in a loop.
## Configuration
No configuration is available.
## Notes
This is an example application of `example`. It is intended as an example
application for new component.
The code under `main` should conform the code style.

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="org.eclipse.cdt.core.default.config.147095941">
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.147095941" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
<externalSettings/>
<extensions/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
<pathentry excluding="**/CMakeFiles/**" kind="out" path="build"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>esp-idf-lib__esp_idf_lib_helpers_examples_default_main</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.core.cBuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.cmake.core.cmakeNature</nature>
</natures>
</projectDescription>

View File

@@ -1,2 +0,0 @@
idf_component_register(SRCS "main.c"
INCLUDE_DIRS ".")

View File

@@ -1,5 +0,0 @@
dependencies:
esp-idf-lib/esp_idf_lib_helpers:
version: '*'
description: default
version: 1.0.0

View File

@@ -1,39 +0,0 @@
/*
* Copyright (c) YYYY YOUR NAME HERE <user@your.dom.ain>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <esp_log.h>
#include <esp_idf_lib_helpers.h>
#include "my_local_header.h"
static char *tag = "main";
void app_main()
{
ESP_LOGI(tag, "An example log");
#if HELPER_TARGET_IS_ESP32
ESP_LOGI(tag, "the target is ESP32");
#else
ESP_LOGI(tag, "the target is not ESP32");
#endif
while (1)
{
vTaskDelay(pdMS_TO_TICKS(1000));
}
}

View File

@@ -1,20 +0,0 @@
/*
* Copyright (c) YYYY YOUR NAME HERE <user@your.dom.ain>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#if !defined(__MY_LOCAL_HEADER__H__)
#define __MY_LOCAL_HEADER__H__
#endif

View File

@@ -1 +0,0 @@
# add required non-default option for the example if any

View File

@@ -1,29 +0,0 @@
dependencies: {}
description: Common support library for esp-idf-lib
discussion: https://github.com/esp-idf-lib/core/discussions
documentation: https://esp-idf-lib.github.io/esp_idf_lib_helpers/
files:
exclude:
- docs/**/*
issues: https://github.com/esp-idf-lib/esp_idf_lib_helpers/issues
license: ISC
maintainers:
- Tomoyuki Sakurai (@trombik) <y@trombik.org>
- Ruslan V. Uss (@UncleRus) <unclerus@gmail.com>
repository: git://github.com/esp-idf-lib/esp_idf_lib_helpers.git
repository_info:
commit_sha: 918d82cafb1f00fd86f1ad8571271cb3e910588b
path: .
targets:
- esp32
- esp32c2
- esp32c3
- esp32c5
- esp32c6
- esp32c61
- esp32h2
- esp32p4
- esp32s2
- esp32s3
url: https://github.com/esp-idf-lib/core
version: 1.4.0

View File

@@ -1 +0,0 @@
--ignore-dir=build

View File

@@ -1,17 +0,0 @@
--align-reference=name
--attach-classes
--attach-classes
--attach-namespaces
--convert-tabs
--exclude=build
--exclude=common
--exclude=managed_components
--ignore-exclude-errors
--indent-switches
--indent=spaces=4
--keep-one-line-statements
--max-continuation-indent=120
--pad-header
--pad-oper
--style=allman
--unpad-paren

View File

@@ -1,66 +0,0 @@
---
Language: Cpp
BasedOnStyle: WebKit
AlignConsecutiveMacros: true
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Always
AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: false
BeforeCatch: true
BeforeElse: true
BeforeLambdaBody: false
BeforeWhile: true
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: false
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
ColumnLimit: 200
CompactNamespaces: true
Cpp11BracedListStyle: false
FixNamespaceComments: true
IndentCaseLabels: true
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 1
NamespaceIndentation: Inner
PointerAlignment: Right
ReflowComments: true
SortIncludes: false
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeInheritanceColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: false
SpaceInEmptyParentheses: false
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
TabWidth: 4
UseTab: Never

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="org.eclipse.cdt.core.default.config.1891936714">
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1891936714" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
<externalSettings/>
<extensions/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
<pathentry excluding="**/CMakeFiles/**" kind="out" path="build"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

View File

@@ -1,32 +0,0 @@
name: i2cdev
description: ESP-IDF I2C master thread-safe utilities
version: 2.1.0
groups:
- common
code_owners:
- UncleRus
- quinkq
- trombik
depends:
- driver
- freertos
- esp_idf_lib_helpers
thread_safe: yes
targets:
- esp32
- esp8266
- esp32s2
- esp32c3
- esp32s3
- esp32c2
- esp32c6
- esp32h2
- esp32p4
- esp32c5
- esp32c61
license: MIT
copyrights:
- name: UncleRus
year: 2018
- name: quinkq
year: 2025

View File

@@ -1,12 +0,0 @@
examples/**/sdkconfig
examples/**/sdkconfig.old
examples/**/build/
examples/**/dependencies.lock
examples/**/managed_components/
docs/_*/
docs/**/*.log
*.swp
*.bak
*.orig
build/
.vscode/

View File

@@ -1,3 +0,0 @@
[submodule "common"]
path = common
url = https://github.com/esp-idf-lib/common.git

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>esp-idf-lib__i2cdev</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.core.cBuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.cmake.core.cmakeNature</nature>
</natures>
</projectDescription>

View File

@@ -1,50 +0,0 @@
# ESP-IDF CMake component for i2cdev library
if(${IDF_VERSION_MAJOR} STREQUAL 5 AND ${IDF_VERSION_MINOR} LESS 3)
# Use driver component as esp_driver_gpio is not available before 5.3
set(req driver freertos log esp_timer)
else()
set(req esp_driver_gpio esp_driver_i2c freertos esp_idf_lib_helpers)
endif()
# ESP-IDF version detection for automatic driver selection
# Check for manual override via Kconfig
if(CONFIG_I2CDEV_USE_LEGACY_DRIVER)
set(USE_LEGACY_DRIVER TRUE)
message(STATUS "i2cdev: Manual override - using legacy driver (CONFIG_I2CDEV_USE_LEGACY_DRIVER=y)")
elseif(NOT DEFINED IDF_VERSION_MAJOR)
# In case older ESP-IDF versions that don't define IDF_VERSION_MAJOR
set(USE_LEGACY_DRIVER TRUE)
message(STATUS "i2cdev: IDF_VERSION_MAJOR not defined, using legacy driver")
elseif(IDF_VERSION_MAJOR LESS 5)
set(USE_LEGACY_DRIVER TRUE)
message(STATUS "i2cdev: ESP-IDF v${IDF_VERSION_MAJOR}.x detected, using legacy driver")
elseif(IDF_VERSION_MAJOR EQUAL 5 AND IDF_VERSION_MINOR LESS 3)
set(USE_LEGACY_DRIVER TRUE)
message(STATUS "i2cdev: ESP-IDF v${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR} detected, using legacy driver")
else()
set(USE_LEGACY_DRIVER FALSE)
message(STATUS "i2cdev: ESP-IDF v${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR} detected, using new i2c_master driver")
endif()
# Conditionally set the source file based on version detection or Kconfig override
if(USE_LEGACY_DRIVER)
set(SRCS "i2cdev_legacy.c")
message(STATUS "i2cdev: Compiling with legacy I2C driver (i2cdev_legacy.c)")
else()
set(SRCS "i2cdev.c")
message(STATUS "i2cdev: Compiling with new I2C master driver (i2cdev.c)")
endif()
# Register the component
idf_component_register(SRCS ${SRCS}
INCLUDE_DIRS "."
REQUIRES ${req})
# include common cmake file for components
set(ESP_IDF_LIB_CMAKE ${CMAKE_CURRENT_LIST_DIR}/common/cmake/esp-idf-lib.cmake)
if(EXISTS ${ESP_IDF_LIB_CMAKE})
include(${ESP_IDF_LIB_CMAKE})
else()
message(WARNING "${ESP_IDF_LIB_CMAKE} not found")
endif()

View File

@@ -1,65 +0,0 @@
menu "I2C Device Library"
config I2CDEV_USE_LEGACY_DRIVER
bool "Use Legacy I2C Driver API"
default n
help
Select this option to use the older ESP-IDF I2C driver API (driver/i2c.h)
instead of the newer driver API (driver/i2c_master.h).
This is automatically determined by the build system based on your ESP-IDF version.
For ESP-IDF versions prior to v5.3, the legacy driver will be used automatically.
You can manually override this setting if needed.
config I2CDEV_AUTO_ENABLE_PULLUPS
bool "Automatically enable internal I2C pullups when not configured"
default n
depends on !IDF_TARGET_ESP8266
help
When enabled, internal pullup resistors are automatically enabled
when both sda_pullup_en and scl_pullup_en are false (default state).
Useful for development and prototyping. Disable for production
systems with external pullups to avoid interference.
Considerations:
- May increase power consumption slightly
- Could interfere with carefully tuned external pullups
- Not recommended for battery-powered applications
Note: This option only affects the modern i2cdev driver (ESP32 family).
Legacy driver behavior is unchanged for compatibility.
config I2CDEV_DEFAULT_SDA_PIN
int "Default I2C SDA pin"
default 21
help
Default SDA pin for I2C devices.
config I2CDEV_DEFAULT_SCL_PIN
int "Default I2C SCL pin"
default 22
help
Default SCL pin for I2C devices.
config I2CDEV_MAX_DEVICES_PER_PORT
int "Maximum number of devices per I2C port"
default 8
help
Maximum number of devices that can be registered on a single I2C port.
config I2CDEV_TIMEOUT
int "I2C transaction timeout, milliseconds"
default 1000
range 10 5000
config I2CDEV_NOLOCK
bool "Disable the use of mutexes"
default n
help
Attention! After enabling this option, all I2C device
drivers will become non-thread safe.
Use this option if you need to access your I2C devices
from interrupt handlers.
endmenu

View File

@@ -1,19 +0,0 @@
config EXAMPLE_I2C_MASTER_SCL
int "SCL GPIO Number"
default 5 if IDF_TARGET_ESP8266
default 6 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C5 || IDF_TARGET_ESP32C6 || IDF_TARGET_ESP32C61
default 19 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3
default 4 if IDF_TARGET_ESP32H2
default 4 if IDF_TARGET_ESP32P4
help
GPIO number for I2C Master clock line.
config EXAMPLE_I2C_MASTER_SDA
int "SDA GPIO Number"
default 4 if IDF_TARGET_ESP8266
default 5 if IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C5 || IDF_TARGET_ESP32C6 || IDF_TARGET_ESP32C61
default 18 if IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3
default 3 if IDF_TARGET_ESP32H2
default 3 if IDF_TARGET_ESP32P4
help
GPIO number for I2C Master data line.

View File

@@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2018 Ruslan V. Uss (https://github.com/UncleRus)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,30 +0,0 @@
# esp-idf-lib/i2cdev
[![Build examples](https://github.com/esp-idf-lib/i2cdev/actions/workflows//build.yml/badge.svg)](https://github.com/esp-idf-lib/i2cdev/actions/workflows//build.yml)
[![Build docs](https://github.com/esp-idf-lib/i2cdev/actions/workflows//build-docs.yml/badge.svg)](https://github.com/esp-idf-lib/i2cdev/actions/workflows//build-docs.yml)
[![Validation](https://github.com/esp-idf-lib/i2cdev/actions/workflows//validate-component.yml/badge.svg)](https://github.com/esp-idf-lib/i2cdev/actions/workflows//validate-component.yml)
ESP-IDF I2C master thread-safe utilities.
* [Documentation](https://esp-idf-lib.github.io/i2cdev/)
* [Repository](https://github.com/esp-idf-lib/i2cdev)
* [Issues](https://github.com/esp-idf-lib/i2cdev/issues)
* [Discussions and questions](https://github.com/esp-idf-lib/core/discussions)
* [Component page at the ESP Component Registry](https://components.espressif.com/components/esp-idf-lib/i2cdev)
## Installation
```sh
idf.py add-dependency esp-idf-lib/i2cdev
```
## Support
For questions and discussions about the component, please use
[Discussions](https://github.com/esp-idf-lib/core/discussions)
at [esp-idf-lib/core](https://github.com/esp-idf-lib/core).
## Contributing
Please read [CONTRIBUTING.md](https://github.com/esp-idf-lib/core/blob/main/CONTRIBUTING.md)
at [esp-idf-lib/core](https://github.com/esp-idf-lib/core).

View File

@@ -1,18 +0,0 @@
#!/usr/bin/env ruby
require "pathname"
require "yaml"
# A simple CLI to get values in .eil.yml
key = ARGV.shift
project_root = Pathname.new(File.expand_path(__FILE__)).parent.parent
eil_file = project_root / ".eil.yml"
doc = YAML.safe_load(File.read eil_file)
case key
when "copyright_string"
puts doc["copyrights"].map { |e| "#{e['year']}, #{e['name']}" }.join(", ")
else
puts doc[key]
end

View File

@@ -1,36 +0,0 @@
# Set common build flags but enable them only when the build is in our CI,
# making them optional. The idea is, fail when compiled in our CI but just
# warn in any other cases. Code that compiles with one toolchain warning-free
# may not do so with another toolchain, which creates a project dependency on
# specific toolchain vendors and versions.
#
# Define flags that may cause failures here.
if (DEFINED ENV{ESP_IDF_LIB_CI})
set(ESP_IDF_LIB_CI_FLAGS
-Werror=unused-variable
-Werror=unused-function
-Werror=write-strings
-Werror
)
endif()
# Set common build flags. Mandatory.
#
# Define flags that do not cause failures here.
set(ESP_IDF_LIB_FLAGS
-Wextra
-Wwrite-strings
-Wunused-variable
-Wunused-function
-Wreturn-type
)
# When COMPONENT_LIB is INTERFACE_LIBRARY, or a header-only library, do not
# set the flags.
get_target_property(COMPONENT_TYPE ${COMPONENT_LIB} TYPE)
if(NOT COMPONENT_TYPE STREQUAL "INTERFACE_LIBRARY")
target_compile_options(${COMPONENT_LIB} PRIVATE
${ESP_IDF_LIB_FLAGS}
${ESP_IDF_LIB_CI_FLAGS}
)
endif()

View File

@@ -1,29 +0,0 @@
COMPONENT_ADD_INCLUDEDIRS = .
ifdef CONFIG_IDF_TARGET_ESP8266
COMPONENT_DEPENDS = esp8266 freertos esp_idf_lib_helpers
# ESP8266 RTOS SDK auto-detects all .c files, so use COMPONENT_OBJS to override
# This prevents both i2cdev.c and i2cdev_legacy.c from being compiled
COMPONENT_OBJS := i2cdev_legacy.o
COMPONENT_SRCDIRS := .
else
COMPONENT_DEPENDS = driver freertos esp_idf_lib_helpers
# For ESP32 family, check for manual override first
ifdef CONFIG_I2CDEV_USE_LEGACY_DRIVER
COMPONENT_SRCS = i2cdev_legacy.c
else
# Check if version variables are available, fallback to legacy if not
ifdef IDF_VERSION_MAJOR
ifeq ($(shell test $(IDF_VERSION_MAJOR) -lt 5 && echo 1),1)
COMPONENT_SRCS = i2cdev_legacy.c
else ifeq ($(shell test $(IDF_VERSION_MAJOR) -eq 5 -a $(IDF_VERSION_MINOR) -lt 3 && echo 1),1)
COMPONENT_SRCS = i2cdev_legacy.c
else
COMPONENT_SRCS = i2cdev.c
endif
else
# Version variables not available - fallback to legacy driver for safety
COMPONENT_SRCS = i2cdev_legacy.c
endif
endif
endif

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="org.eclipse.cdt.core.default.config.989573216">
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.989573216" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
<externalSettings/>
<extensions/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
<pathentry excluding="**/CMakeFiles/**" kind="out" path="build"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>default</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.core.cBuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.cmake.core.cmakeNature</nature>
</natures>
</projectDescription>

View File

@@ -1,7 +0,0 @@
# The following four lines of boilerplate have to be in your project's CMakeLists
# in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(i2c_scanner)

View File

@@ -1,5 +0,0 @@
#V := 1
PROJECT_NAME := i2c_scanner
include $(IDF_PATH)/make/project.mk

View File

@@ -1,31 +0,0 @@
# I2C bus scanner
## What it does
This example scans the i2c bus in a loop and prints out a table with the addresses of the found i2c devices.
## Wiring
Connect `SCL` and `SDA` pins to the following pins with appropriate pull-up
resistors.
| Name | Description | Defaults |
|------|-------------|----------|
| `CONFIG_EXAMPLE_I2C_MASTER_SCL` | GPIO number for `SCL` | "5" for `esp8266`, "6" for `esp32c3`, "19" for `esp32`, `esp32s2`, and `esp32s3` |
| `CONFIG_EXAMPLE_I2C_MASTER_SDA` | GPIO number for `SDA` | "4" for `esp8266`, "5" for `esp32c3`, "18" for `esp32`, `esp32s2`, and `esp32s3` |
## Example output
Three devices found on a bus: 0x38, 0x60 and 0x77
```
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
```

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="org.eclipse.cdt.core.default.config.1721799072">
<storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1721799072" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
<externalSettings/>
<extensions/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.pathentry">
<pathentry excluding="**/CMakeFiles/**" kind="out" path="build"/>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
</cproject>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>default_main</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.core.cBuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.cmake.core.cmakeNature</nature>
</natures>
</projectDescription>

Some files were not shown because too many files have changed in this diff Show More