Index: do.bat
===================================================================
--- /YC1308AF/branch/usb/USB_64K/do.bat	(revision 1616)
+++ /YC1308AF/branch/usb/USB_64K/do.bat	(working copy)
@@ -72,11 +72,11 @@
 ::echo exist c51 code
 ::geneep
 
-if "%device_option%" equ "mouse" (
+if "%device_option%" equ "dongle" (
 cd ..\output
 copy eeprom.dat ..\util\eeprom.dat
 cd ..\util
-eeprom2fulleeprom.exe eeprom.dat 128>compare2.dat
+eeprom2fulleeprom.exe eeprom.dat 64>compare2.dat
 crc16.exe compare2.dat 2 >..\output\eeprom.dat
 del eeprom.dat
 del compare2.dat
Index: format/app_dongle.format
===================================================================
--- /YC1308AF/branch/usb/USB_64K/format/app_dongle.format	(revision 1616)
+++ /YC1308AF/branch/usb/USB_64K/format/app_dongle.format	(working copy)
@@ -31,6 +31,22 @@
 1 mem_soft_agc_en
 1 mem_24g_mouse_bind_enable
 1 mem_24g_keyboard_bind_enable
+
+
+//uart start 
+1 mem_device_uart_tx_gpio
+1 mem_device_uart_rx_gpio
+2 mem_device_uart_rx_buffer
+2 mem_device_uart_rx_buffer_end
+2 mem_device_uart_tx_buffer
+2 mem_device_uart_tx_buffer_end
+2 mem_device_uart_baud_rate
+//uart end
+
+1 mem_g24_bind_step
+1 mem_g24_bind_success
+1 mem_g24_bind_continue_enable
+2 mem_cb_24g_bind_continue
 )
 
 
Index: output/eeprom.dat
===================================================================
--- /YC1308AF/branch/usb/USB_64K/output/eeprom.dat	(revision 1616)
+++ /YC1308AF/branch/usb/USB_64K/output/eeprom.dat	(working copy)
@@ -2,8 +2,8 @@
 02
 aa
 55
-b6
-03
+c2
+04
 c2
 84
 00
@@ -11,35 +11,35 @@
 c0
 41
 80
-17
+36
 c0
 42
 80
-1e
+3d
 c0
 45
 00
-2c
+4b
 c0
 45
 80
-32
+51
 c0
 46
 00
-70
+8f
 c0
 56
 80
-11
+12
 c0
 5d
 00
-3e
+5d
 c0
 5d
 80
-40
+5f
 20
 20
 13
@@ -47,27 +47,31 @@
 c0
 46
 00
-8b
+b5
 c0
 47
 00
-8f
+b9
 c0
 49
 80
-9f
+c9
 c0
 53
 80
-85
+a4
 c0
 70
 00
-a5
+cf
 c0
 72
 00
-b6
+e0
+c0
+73
+01
+18
 20
 20
 13
@@ -75,27 +79,147 @@
 58
 00
 00
-14
+1d
+67
+e1
+49
+52
+58
+00
+00
+21
 67
 e1
 48
 8d
+58
+00
+37
+9c
+67
+e1
+48
+91
+58
+00
+37
+ad
+67
+e1
+48
+93
+58
+00
+00
+2f
+67
+e1
+48
+8f
 20
 20
 36
-9c
+a2
+6f
+e0
+c9
+50
+24
+7a
+00
+00
+70
+49
+50
+01
+20
+20
+23
+ca
 6f
 e0
 c8
 bd
 c0
+00
+00
+26
+c0
+00
+b6
+fd
+c0
 07
 80
-61
+80
+20
+60
+00
+00
 20
+40
+24
+3a
 20
-36
-cd
+40
+24
+3e
+20
+40
+24
+64
+20
+40
+37
+6b
+20
+40
+24
+9c
+20
+40
+24
+b9
+20
+40
+37
+2f
+20
+40
+00
+ad
+20
+20
+00
+27
+6f
+e0
+c9
+4f
+c0
+02
+00
+32
+20
+20
+37
+73
+70
+48
+c3
+01
+70
+49
+51
+01
+20
+40
+00
+aa
+20
+20
+00
+31
 70
 89
 00
@@ -131,7 +255,7 @@
 24
 3a
 00
-27
+46
 20
 40
 4d
@@ -187,7 +311,7 @@
 24
 3a
 00
-2f
+4e
 20
 20
 12
@@ -239,7 +363,7 @@
 20
 40
 00
-65
+84
 20
 40
 62
@@ -255,7 +379,7 @@
 20
 40
 00
-3c
+5b
 20
 20
 37
@@ -275,7 +399,7 @@
 20
 40
 00
-45
+64
 20
 20
 37
@@ -287,11 +411,11 @@
 20
 40
 00
-48
+67
 20
 20
 00
-54
+73
 6f
 e0
 c9
@@ -407,7 +531,7 @@
 20
 20
 00
-62
+81
 6f
 e0
 c8
@@ -415,7 +539,7 @@
 c0
 07
 80
-69
+88
 70
 49
 40
@@ -499,7 +623,7 @@
 20
 40
 00
-6b
+8a
 1f
 e6
 7e
@@ -523,7 +647,7 @@
 24
 20
 80
-83
+a2
 58
 00
 00
@@ -560,6 +684,50 @@
 60
 00
 00
+d8
+e0
+00
+0d
+58
+00
+00
+50
+20
+20
+7d
+db
+6f
+e0
+c9
+51
+20
+7a
+00
+00
+d8
+e0
+00
+0d
+20
+40
+7d
+e9
+24
+7a
+00
+00
+70
+49
+51
+00
+6f
+e1
+49
+52
+20
+20
+7e
+7a
 20
 40
 6e
@@ -591,7 +759,7 @@
 c0
 00
 00
-94
+be
 20
 20
 7a
@@ -615,7 +783,7 @@
 c0
 00
 80
-9a
+c4
 20
 20
 7a
@@ -627,7 +795,7 @@
 c0
 04
 80
-9d
+c7
 20
 20
 7a
@@ -739,15 +907,15 @@
 c0
 55
 00
-bb
+e5
 c0
 2a
 80
-c5
+ef
 c0
 11
 00
-d5
+ff
 20
 20
 23
@@ -759,11 +927,11 @@
 c0
 00
 80
-bf
+e9
 c0
 01
 00
-c2
+ec
 20
 60
 00
@@ -799,7 +967,7 @@
 20
 3a
 00
-cb
+f5
 6f
 e2
 48
@@ -823,11 +991,11 @@
 c0
 00
 80
-cf
+f9
 c0
 01
 00
-d2
+fc
 20
 60
 00
@@ -862,8 +1030,8 @@
 5e
 20
 3a
-00
-db
+01
+05
 6f
 e2
 48
@@ -886,12 +1054,12 @@
 98
 c0
 00
-80
-df
+81
+09
 c0
 01
-00
-e6
+01
+11
 20
 60
 00
@@ -910,20 +1078,24 @@
 82
 c0
 01
-00
-e4
+01
+0e
 20
 60
 00
 00
 70
 49
+4f
+04
+70
+49
 41
 01
 20
 20
 23
-a9
+aa
 6f
 e0
 c9
@@ -938,8 +1110,8 @@
 83
 c0
 80
-00
-eb
+01
+16
 20
 60
 00
@@ -952,15 +1124,111 @@
 20
 23
 b4
-5d
-13
-aa
-55
-40
-00
-00
-40
-00
+6f
+e0
+c8
+c3
+c1
+80
+80
+00
+20
+40
+23
+4b
+20
+40
+01
+26
+6f
+e0
+c8
+bd
+24
+7a
+00
+00
+6f
+e0
+c8
+84
+20
+7a
+00
+00
+6f
+e0
+c9
+50
+20
+7a
+00
+00
+70
+48
+c0
+00
+20
+40
+24
+93
+20
+40
+24
+36
+20
+20
+22
+b2
+20
+40
+23
+fa
+20
+40
+21
+87
+24
+37
+a3
+fa
+20
+40
+23
+67
+20
+40
+24
+2c
+20
+40
+01
+2d
+20
+20
+23
+5f
+6f
+e0
+c9
+50
+20
+7a
+00
+00
+20
+20
+23
+d6
+de
+ea
+aa
+55
+40
+00
+00
+40
+00
 00
 00
 00
@@ -1020,7 +1288,7 @@
 00
 00
 00
-11
+51
 00
 00
 00
@@ -1076,6 +1344,13 @@
 55
 01
 00
+5e
+48
+01
+aa
+55
+01
+00
 9a
 40
 04
@@ -1086,5 +1361,6832 @@
 7b
 41
 14
+55
+aa
+aa
+55
 40
-9b
+14
+21
+69
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+ff
+85
+8c
Index: output/memmap.format
===================================================================
--- /YC1308AF/branch/usb/USB_64K/output/memmap.format	(revision 1616)
+++ /YC1308AF/branch/usb/USB_64K/output/memmap.format	(working copy)
@@ -1930,6 +1930,17 @@
 0x4940 mem_soft_agc_en
 0x4941 mem_24g_mouse_bind_enable
 0x4942 mem_24g_keyboard_bind_enable
+0x4943 mem_device_uart_tx_gpio
+0x4944 mem_device_uart_rx_gpio
+0x4945 mem_device_uart_rx_buffer
+0x4947 mem_device_uart_rx_buffer_end
+0x4949 mem_device_uart_tx_buffer
+0x494b mem_device_uart_tx_buffer_end
+0x494d mem_device_uart_baud_rate
+0x494f mem_g24_bind_step
+0x4950 mem_g24_bind_success
+0x4951 mem_g24_bind_continue_enable
+0x4952 mem_cb_24g_bind_continue
 0x4882 mem_rssi_hex_received
 0x4883 mem_24g_pair_sm
 0x4884 mem_24g_pair_no_ack
Index: output/program.lis
===================================================================
--- /YC1308AF/branch/usb/USB_64K/output/program.lis	(revision 1616)
+++ /YC1308AF/branch/usb/USB_64K/output/program.lis	(working copy)
@@ -1,336 +1,427 @@
               include "bt_format "
               org 0x0000
 0000 c284000a bbit1 8 ,pf_patch_ext 
-0001 c0418017 beq patch10_3 ,p_set_sync_on 
-0002 c042801e beq patch10_5 ,p_rf_rx_enable 
-0003 c045002c beq patch11_2 ,p_txon_next 
-0004 c0458032 beq patch11_3 ,p_initialize_radio_cont 
-0005 c0460070 beq patch11_4 ,p_save_rssi 
-0006 c0568011 beq patch15_5 ,p_app_init 
-0007 c05d003e beq patch17_2 ,p_dongle_usb_dispatch 
-0008 c05d8040 beq patch17_3 ,p_dongle_work_mode_auto 
+0001 c0418036 beq patch10_3 ,p_set_sync_on 
+0002 c042803d beq patch10_5 ,p_rf_rx_enable 
+0003 c045004b beq patch11_2 ,p_txon_next 
+0004 c0458051 beq patch11_3 ,p_initialize_radio_cont 
+0005 c046008f beq patch11_4 ,p_save_rssi 
+0006 c0568012 beq patch15_5 ,p_app_init 
+0007 c05d005d beq patch17_2 ,p_dongle_usb_dispatch 
+0008 c05d805f beq patch17_3 ,p_dongle_work_mode_auto 
 0009 2020137e branch loop 
 
 pf_patch_ext:
-000a c046008b beq patch31_4 ,p_usb_init 
-000b c047008f beq patch31_6 ,p_usb_class_type 
-000c c049809f beq patch32_3 ,p_usb_tx 
-000d c0538085 beq patch34_7 ,p_le_enable 
-000e c07000a5 beq patch3c_0 ,p_g24_receive_skip_end 
-000f c07200b6 beq patch3c_4 ,p_g24_bind_data_parse_next 
-0010 2020137e branch loop 
+000a c04600b5 beq patch31_4 ,p_usb_init 
+000b c04700b9 beq patch31_6 ,p_usb_class_type 
+000c c04980c9 beq patch32_3 ,p_usb_tx 
+000d c05380a4 beq patch34_7 ,p_le_enable 
+000e c07000cf beq patch3c_0 ,p_g24_receive_skip_end 
+000f c07200e0 beq patch3c_4 ,p_g24_bind_data_parse_next 
+0010 c0730118 beq patch3c_6 ,p_g24_bind_mode_auto 
+0011 2020137e branch loop 
 
 p_app_init:
 
 p_dongle_init:
-0011 58000014 setarg p_dongle_dispatch 
-0012 67e1488d store 2 ,mem_cb_24g_receive_process 
-0013 2020369c branch dongle_init + 2 
+0012 5800001d setarg p_g24_bind_continue_timer 
+0013 67e14952 store 2 ,mem_cb_24g_bind_continue 
+0014 58000021 setarg p_dongle_dispatch 
+0015 67e1488d store 2 ,mem_cb_24g_receive_process 
+0016 5800379c setarg dongle_g24_mouse 
+0017 67e14891 store 2 ,mem_cb_24g_data_device1 
+0018 580037ad setarg dongle_g24_kb 
+0019 67e14893 store 2 ,mem_cb_24g_data_device2 
+001a 5800002f setarg p_dongle_ackpayload_prep 
+001b 67e1488f store 2 ,mem_cb_24g_ackpayload 
+001c 202036a2 branch dongle_init + 8 
+
+p_g24_bind_continue_timer:
+001d 6fe0c950 fetch 1 ,mem_g24_bind_success 
+001e 247a0000 nrtn blank 
+001f 70495001 jam 1 ,mem_g24_bind_success 
+0020 202023ca branch g24_binding_dvc1_living 
 
 p_dongle_dispatch:
-0014 6fe0c8bd fetch 1 ,mem_24g_pair_mode 
-0015 c0078061 beq 0x0f ,p_dongle_all_powerful 
-0016 202036cd branch dongle_dispatch + 1 
+0021 6fe0c8bd fetch 1 ,mem_24g_pair_mode 
+0022 c0000026 beq 0x00 ,p_dongle_auto_bind 
+0023 c000b6fd beq 0x01 ,dongle_pc_bind 
+0024 c0078080 beq 0x0f ,p_dongle_all_powerful 
+0025 20600000 rtn 
+
+p_dongle_auto_bind:
+0026 2040243a call g24_mode_switch_init 
+
+p_dongle_auto_bind_loop:
+0027 2040243e call g24_mode_switch_bind_work 
+0028 20402464 call g24_mode_switch_bind_search 
+0029 2040376b call dongle_work_mode_auto 
+002a 2040249c call g24_bind_mode_auto 
+002b 204024b9 call g24_search_mode_auto 
+002c 2040372f call dongle_usb_dispatch 
+002d 204000ad call p_timer_check 
+002e 20200027 branch p_dongle_auto_bind_loop 
+
+p_dongle_ackpayload_prep:
+002f 6fe0c94f fetch 1 ,mem_g24_bind_step 
+0030 c0020032 beq 4 ,p_g24_bind_dvc1_exit 
+
+p_dongle_ackpayload_prep_end:
+0031 20203773 branch dongle_ackpayload_prep 
+
+p_g24_bind_dvc1_exit:
+0032 7048c301 jam dongle_bind ,mem_24g_work_mode 
+0033 70495101 jam 1 ,mem_g24_bind_continue_enable 
+0034 204000aa call p_timer_init 
+0035 20200031 branch p_dongle_ackpayload_prep_end 
 
 p_set_sync_on:
-0017 70890005 jam 0x5 ,modem_en 
-0018 20000002 nop 2 
-0019 70890000 jam 0x0 ,modem_en 
-001a 6fe0c0c5 fetch 1 ,mem_fcomp_div 
-001b c0841164 bne xtal_16m ,set_sync_on_24m 
+0036 70890005 jam 0x5 ,modem_en 
+0037 20000002 nop 2 
+0038 70890000 jam 0x0 ,modem_en 
+0039 6fe0c0c5 fetch 1 ,mem_fcomp_div 
+003a c0841164 bne xtal_16m ,set_sync_on_24m 
 
 p_set_sync_on_16m:
-001c 708a8729 jam 0x29 ,core_syn_afc_cfg1 
-001d 20201179 branch set_sync_on_16m 
+003b 708a8729 jam 0x29 ,core_syn_afc_cfg1 
+003c 20201179 branch set_sync_on_16m 
 
 p_rf_rx_enable:
-001e 6fe0c940 fetch 1 ,mem_soft_agc_en 
-001f 243a0027 nbranch p_rf_rx_enable_soft_agc ,blank 
-0020 20404d05 call rf_debug_rx_gpio_high 
-0021 d8c041eb arg mem_gain_table ,contr 
-0022 98c08c00 iadd contr ,contr 
-0023 efe08006 ifetch 1 ,contr 
-0024 67f08961 store 1 ,core_rf_rx_gain_fix 
-0025 7089602e jam 0x2e ,core_rf_rx_agc_ctrl 
-0026 202011af branch rf_rx_enable_no_soft_agc_next 
+003d 6fe0c940 fetch 1 ,mem_soft_agc_en 
+003e 243a0046 nbranch p_rf_rx_enable_soft_agc ,blank 
+003f 20404d05 call rf_debug_rx_gpio_high 
+0040 d8c041eb arg mem_gain_table ,contr 
+0041 98c08c00 iadd contr ,contr 
+0042 efe08006 ifetch 1 ,contr 
+0043 67f08961 store 1 ,core_rf_rx_gain_fix 
+0044 7089602e jam 0x2e ,core_rf_rx_agc_ctrl 
+0045 202011af branch rf_rx_enable_no_soft_agc_next 
 
 p_rf_rx_enable_soft_agc:
-0027 6ff08960 fetch 1 ,core_rf_rx_agc_ctrl 
-0028 1fe1fe01 or pdata ,0x01 ,pdata 
-0029 67f08960 store 1 ,core_rf_rx_agc_ctrl 
-002a 70896108 jam 0x08 ,core_rf_rx_gain_fix 
-002b 202011af branch rf_rx_enable_no_soft_agc_next 
+0046 6ff08960 fetch 1 ,core_rf_rx_agc_ctrl 
+0047 1fe1fe01 or pdata ,0x01 ,pdata 
+0048 67f08960 store 1 ,core_rf_rx_agc_ctrl 
+0049 70896108 jam 0x08 ,core_rf_rx_gain_fix 
+004a 202011af branch rf_rx_enable_no_soft_agc_next 
 
 p_txon_next:
-002c 6fe0c940 fetch 1 ,mem_soft_agc_en 
-002d 243a002f nbranch p_set_tx_power_f20db ,blank 
-002e 20201237 branch set_tx_power_10db 
+004b 6fe0c940 fetch 1 ,mem_soft_agc_en 
+004c 243a004e nbranch p_set_tx_power_f20db ,blank 
+004d 20201237 branch set_tx_power_10db 
 
 p_set_tx_power_f20db:
-002f 708a3953 jam 0x53 ,core_tx_pwr_ctrl0 
-0030 708a3a01 jam 0x01 ,core_tx_pwr_ctrl1 
-0031 20201226 branch set_rf_ldo_cfg89 
+004e 708a3953 jam 0x53 ,core_tx_pwr_ctrl0 
+004f 708a3a01 jam 0x01 ,core_tx_pwr_ctrl1 
+0050 20201226 branch set_rf_ldo_cfg89 
 
 p_initialize_radio_cont:
-0032 7041eaff jam 0xff ,mem_gain_fix 
-0033 708a8500 jam 0x00 ,core_syn_loopdiv_dsm_cfg 
-0034 70892140 jam 0x40 ,0x8921 
-0035 70486702 jam 0x02 ,mem_24g_rx_phy 
-0036 70486802 jam 0x02 ,mem_24g_tx_phy 
-0037 70487a01 jam 0x01 ,mem_24g_disable_fec1 
-0038 7048bc1e jam 0x1e ,mem_24g_hop_interval 
-0039 20401252 call initialize_radio_cont + 1 
-003a 20400065 call p_g24_fast_conn_mode_check 
-003b 204062a4 call wdt_set_enable 
+0051 7041eaff jam 0xff ,mem_gain_fix 
+0052 708a8500 jam 0x00 ,core_syn_loopdiv_dsm_cfg 
+0053 70892140 jam 0x40 ,0x8921 
+0054 70486702 jam 0x02 ,mem_24g_rx_phy 
+0055 70486802 jam 0x02 ,mem_24g_tx_phy 
+0056 70487a01 jam 0x01 ,mem_24g_disable_fec1 
+0057 7048bc1e jam 0x1e ,mem_24g_hop_interval 
+0058 20401252 call initialize_radio_cont + 1 
+0059 20400084 call p_g24_fast_conn_mode_check 
+005a 204062a4 call wdt_set_enable 
 
 p_wdt_kick:
-003c 5800007d setarg 125 
-003d 20206295 branch wdt_init_config 
+005b 5800007d setarg 125 
+005c 20206295 branch wdt_init_config 
 
 p_dongle_usb_dispatch:
-003e 2040003c call p_wdt_kick 
-003f 20203730 branch dongle_usb_dispatch + 1 
+005d 2040005b call p_wdt_kick 
+005e 20203730 branch dongle_usb_dispatch + 1 
 
 p_dongle_work_mode_auto:
-0040 6fe0c8c3 fetch 1 ,mem_24g_work_mode 
-0041 c1800000 rtnne dongle_work 
-0042 20402497 call g24_work_mode_start 
-0043 20400045 call p_dongle_g24_blank_data_process 
-0044 20203770 branch dongle_work_mode_auto + 5 
+005f 6fe0c8c3 fetch 1 ,mem_24g_work_mode 
+0060 c1800000 rtnne dongle_work 
+0061 20402497 call g24_work_mode_start 
+0062 20400064 call p_dongle_g24_blank_data_process 
+0063 20203770 branch dongle_work_mode_auto + 5 
 
 p_dongle_g24_blank_data_process:
-0045 20403705 call dongle_g24_ms_blank_data 
-0046 20400048 call p_dongle_g24_kb_blank_data 
-0047 20200054 branch p_dongle_g24_kb_mul_blank_data 
+0064 20403705 call dongle_g24_ms_blank_data 
+0065 20400067 call p_dongle_g24_kb_blank_data 
+0066 20200073 branch p_dongle_g24_kb_mul_blank_data 
 
 p_dongle_g24_kb_blank_data:
-0048 6fe0c912 fetch 1 ,mem_dg_kb_blank_data_enable 
-0049 207a0000 rtn blank 
-004a d8e0000e arg timer_kb_blank ,queue 
-004b 20407de9 call timer_check 
-004c 247a0000 nrtn blank 
-004d 70491200 jam 0 ,mem_dg_kb_blank_data_enable 
-004e d8a00c0f arg mem_usb_kb_data ,contw 
-004f df200002 arg 2 ,loopcnt 
-0050 20407d8c call memset0 
-0051 6fe40c0f fetch 8 ,mem_usb_kb_data 
-0052 67e448fe store 8 ,mem_dg_kb_data_last_data 
-0053 2020371d branch dongle_usb_tx_kb_data 
+0067 6fe0c912 fetch 1 ,mem_dg_kb_blank_data_enable 
+0068 207a0000 rtn blank 
+0069 d8e0000e arg timer_kb_blank ,queue 
+006a 20407de9 call timer_check 
+006b 247a0000 nrtn blank 
+006c 70491200 jam 0 ,mem_dg_kb_blank_data_enable 
+006d d8a00c0f arg mem_usb_kb_data ,contw 
+006e df200002 arg 2 ,loopcnt 
+006f 20407d8c call memset0 
+0070 6fe40c0f fetch 8 ,mem_usb_kb_data 
+0071 67e448fe store 8 ,mem_dg_kb_data_last_data 
+0072 2020371d branch dongle_usb_tx_kb_data 
 
 p_dongle_g24_kb_mul_blank_data:
-0054 6fe0c913 fetch 1 ,mem_dg_kb_mul_blank_data_enable 
-0055 207a0000 rtn blank 
-0056 d8e0000c arg timer_kb_mul_blank ,queue 
-0057 20407de9 call timer_check 
-0058 247a0000 nrtn blank 
-0059 70491300 jam 0 ,mem_dg_kb_mul_blank_data_enable 
-005a d8a00c1f arg mem_usb_kb_multikey ,contw 
-005b df200002 arg 2 ,loopcnt 
-005c 20407d8c call memset0 
-005d 700c1f03 jam kb_multikey_report_id ,mem_usb_kb_multikey 
-005e 6fe18c1f fetch 3 ,mem_usb_kb_multikey 
-005f 67e1c909 store 3 ,mem_dg_kb_multikey_last_data 
-0060 2020372d branch dongle_usb_tx_multikey_data 
+0073 6fe0c913 fetch 1 ,mem_dg_kb_mul_blank_data_enable 
+0074 207a0000 rtn blank 
+0075 d8e0000c arg timer_kb_mul_blank ,queue 
+0076 20407de9 call timer_check 
+0077 247a0000 nrtn blank 
+0078 70491300 jam 0 ,mem_dg_kb_mul_blank_data_enable 
+0079 d8a00c1f arg mem_usb_kb_multikey ,contw 
+007a df200002 arg 2 ,loopcnt 
+007b 20407d8c call memset0 
+007c 700c1f03 jam kb_multikey_report_id ,mem_usb_kb_multikey 
+007d 6fe18c1f fetch 3 ,mem_usb_kb_multikey 
+007e 67e1c909 store 3 ,mem_dg_kb_multikey_last_data 
+007f 2020372d branch dongle_usb_tx_multikey_data 
 
 p_dongle_all_powerful:
-0061 20402493 call g24_switch_work_mode 
+0080 20402493 call g24_switch_work_mode 
 
 p_dongle_all_powerful_loop:
-0062 2040376b call dongle_work_mode_auto 
-0063 2040372f call dongle_usb_dispatch 
-0064 20200062 branch p_dongle_all_powerful_loop 
+0081 2040376b call dongle_work_mode_auto 
+0082 2040372f call dongle_usb_dispatch 
+0083 20200081 branch p_dongle_all_powerful_loop 
 
 p_g24_fast_conn_mode_check:
-0065 6fe0c8bd fetch 1 ,mem_24g_pair_mode 
-0066 c0078069 beq 0x0f ,p_soft_agc_en_true 
+0084 6fe0c8bd fetch 1 ,mem_24g_pair_mode 
+0085 c0078088 beq 0x0f ,p_soft_agc_en_true 
 
 p_soft_agc_en_false:
-0067 70494000 jam 0 ,mem_soft_agc_en 
-0068 20600000 rtn 
+0086 70494000 jam 0 ,mem_soft_agc_en 
+0087 20600000 rtn 
 
 p_soft_agc_en_true:
-0069 70494001 jam 1 ,mem_soft_agc_en 
-006a 20600000 rtn 
+0088 70494001 jam 1 ,mem_soft_agc_en 
+0089 20600000 rtn 
 
 p_byte_sign_extern:
-006b 2feffe07 isolate1 7 ,pdata 
-006c 24608000 nrtn true 
-006d d840ff00 arg 0xff00 ,temp 
-006e 9841fe00 ior temp ,pdata 
-006f 20600000 rtn 
+008a 2feffe07 isolate1 7 ,pdata 
+008b 24608000 nrtn true 
+008c d840ff00 arg 0xff00 ,temp 
+008d 9841fe00 ior temp ,pdata 
+008e 20600000 rtn 
 
 p_save_rssi:
-0070 6ff089a2 fetch 1 ,modem_nb_pow 
-0071 2feffe06 isolate1 6 ,pdata 
-0072 7920fe07 setflag true ,7 ,pdata 
-0073 67e0c1e9 store 1 ,mem_modem_rssi 
-0074 6ff089a3 fetch 1 ,modem_gain 
-0075 1fe1040f and pdata ,0x0f ,temp 
-0076 18438400 lshift temp ,temp 
-0077 1ff1fe00 rshift4 pdata ,pdata 
-0078 98408400 iadd temp ,temp 
-0079 184fa203 mul32 temp ,3 ,rega 
-007a 6fe0c1e9 fetch 1 ,mem_modem_rssi 
-007b 2040006b call p_byte_sign_extern 
-007c 1fe67e00 sub pdata ,0 ,pdata 
-007d 9a20fe00 iadd rega ,pdata 
-007e 1fe0fff7 increase -9 ,pdata 
-007f 1fe17fff and pdata ,0x1ff ,pdata 
-0080 2feffe08 isolate1 8 ,pdata 
-0081 24208083 nbranch p_save_rssi_store ,true 
-0082 58000000 setarg 0 
+008f 6ff089a2 fetch 1 ,modem_nb_pow 
+0090 2feffe06 isolate1 6 ,pdata 
+0091 7920fe07 setflag true ,7 ,pdata 
+0092 67e0c1e9 store 1 ,mem_modem_rssi 
+0093 6ff089a3 fetch 1 ,modem_gain 
+0094 1fe1040f and pdata ,0x0f ,temp 
+0095 18438400 lshift temp ,temp 
+0096 1ff1fe00 rshift4 pdata ,pdata 
+0097 98408400 iadd temp ,temp 
+0098 184fa203 mul32 temp ,3 ,rega 
+0099 6fe0c1e9 fetch 1 ,mem_modem_rssi 
+009a 2040008a call p_byte_sign_extern 
+009b 1fe67e00 sub pdata ,0 ,pdata 
+009c 9a20fe00 iadd rega ,pdata 
+009d 1fe0fff7 increase -9 ,pdata 
+009e 1fe17fff and pdata ,0x1ff ,pdata 
+009f 2feffe08 isolate1 8 ,pdata 
+00a0 242080a2 nbranch p_save_rssi_store ,true 
+00a1 58000000 setarg 0 
 
 p_save_rssi_store:
-0083 67e08154 store 1 ,mem_rssi_hex 
-0084 20201293 branch rssi_hex2dec 
+00a2 67e08154 store 1 ,mem_rssi_hex 
+00a3 20201293 branch rssi_hex2dec 
 
 p_le_enable:
-0085 20401652 call le_enable + 1 
-0086 708a6d89 jam 0x89 ,core_rx_bq_cfg0 
-0087 6ff08a43 fetch 1 ,core_syn_cal_ctrl 
-0088 1fe1fe0f or pdata ,0x0f ,pdata 
-0089 67f08a43 store 1 ,core_syn_cal_ctrl 
-008a 20600000 rtn 
+00a4 20401652 call le_enable + 1 
+00a5 708a6d89 jam 0x89 ,core_rx_bq_cfg0 
+00a6 6ff08a43 fetch 1 ,core_syn_cal_ctrl 
+00a7 1fe1fe0f or pdata ,0x0f ,pdata 
+00a8 67f08a43 store 1 ,core_syn_cal_ctrl 
+00a9 20600000 rtn 
+
+p_timer_init:
+00aa d8e0000d arg 13 ,queue 
+00ab 58000050 setarg 80 
+00ac 20207ddb branch timer_init 
+
+p_timer_check:
+00ad 6fe0c951 fetch 1 ,mem_g24_bind_continue_enable 
+00ae 207a0000 rtn blank 
+00af d8e0000d arg 13 ,queue 
+00b0 20407de9 call timer_check 
+00b1 247a0000 nrtn blank 
+00b2 70495100 jam 0 ,mem_g24_bind_continue_enable 
+00b3 6fe14952 fetch 2 ,mem_cb_24g_bind_continue 
+00b4 20207e7a branch callback_func 
 
 p_usb_init:
-008b 20406e5e call enable_authrom 
-008c 20407a27 call usb_init_param 
-008d 700aa803 jam 0x03 ,mem_devicedesc + 17 
-008e 20207a0b branch usb_init_next 
+00b5 20406e5e call enable_authrom 
+00b6 20407a27 call usb_init_param 
+00b7 700aa803 jam 0x03 ,mem_devicedesc + 17 
+00b8 20207a0b branch usb_init_next 
 
 p_usb_class_type:
-008f 793f8023 set0 mark_isstr ,mark 
-0090 6fe08b59 fetch 1 ,mem_usb_setup_bmrequesttype 
-0091 1fe17e80 and_into 0x80 ,pdata 
-0092 c0000094 beq out_device ,p_usb_out_device 
-0093 20207aa1 branch usb_class_type + 4 
+00b9 793f8023 set0 mark_isstr ,mark 
+00ba 6fe08b59 fetch 1 ,mem_usb_setup_bmrequesttype 
+00bb 1fe17e80 and_into 0x80 ,pdata 
+00bc c00000be beq out_device ,p_usb_out_device 
+00bd 20207aa1 branch usb_class_type + 4 
 
 p_usb_out_device:
-0094 6fe08b59 fetch 1 ,mem_usb_setup_bmrequesttype 
-0095 1ff1fe00 rshift4 pdata ,pdata 
-0096 1fe37e00 rshift pdata ,pdata 
-0097 1fe17e03 and_into 0x03 ,pdata 
-0098 c000809a beq class_req ,p_usb_out_class_req 
-0099 20207ab4 branch usb_out_device + 4 
+00be 6fe08b59 fetch 1 ,mem_usb_setup_bmrequesttype 
+00bf 1ff1fe00 rshift4 pdata ,pdata 
+00c0 1fe37e00 rshift pdata ,pdata 
+00c1 1fe17e03 and_into 0x03 ,pdata 
+00c2 c00080c4 beq class_req ,p_usb_out_class_req 
+00c3 20207ab4 branch usb_out_device + 4 
 
 p_usb_out_class_req:
-009a 6fe08b5a fetch 1 ,mem_usb_setup_brequest 
-009b c004809d beq set_report ,p_usb_set_report 
-009c 20207acd branch usb_out_class_req + 1 
+00c4 6fe08b5a fetch 1 ,mem_usb_setup_brequest 
+00c5 c00480c7 beq set_report ,p_usb_set_report 
+00c6 20207acd branch usb_out_class_req + 1 
 
 p_usb_set_report:
-009d 20003a98 nop 15000 
-009e 20207c4a branch usb_set_report 
+00c7 20003a98 nop 15000 
+00c8 20207c4a branch usb_set_report 
 
 p_usb_tx:
-009f 6fe08bf9 fetch 1 ,mem_usb_tx_enable 
-00a0 207a0000 rtn blank 
-00a1 6ff08c24 fetch 1 ,core_usb_txbusy 
-00a2 1fe17e0f and_into 0x0f ,pdata 
-00a3 243a7d17 nbranch usb_inwake_state_tx_dispose ,blank 
-00a4 20207ccc branch usb_tx + 3 
+00c9 6fe08bf9 fetch 1 ,mem_usb_tx_enable 
+00ca 207a0000 rtn blank 
+00cb 6ff08c24 fetch 1 ,core_usb_txbusy 
+00cc 1fe17e0f and_into 0x0f ,pdata 
+00cd 243a7d17 nbranch usb_inwake_state_tx_dispose ,blank 
+00ce 20207ccc branch usb_tx + 3 
 
 p_g24_receive_skip_end:
-00a5 6fe0c868 fetch 1 ,mem_24g_tx_phy 
-00a6 20401637 call le_enable_phy_by_pdata 
-00a7 6fe2483f fetch 4 ,mem_24g_addr 
-00a8 98001200 iforce access 
-00a9 20402181 call g24_prep 
-00aa 2040115d call set_sync_on 
-00ab 6848c83d fetcht 1 ,mem_24g_ch 
-00ac 708a3d12 jam 0x12 ,core_syn_top_ctrl 
-00ad 60488017 storet 1 ,mem_last_freq 
-00ae 1840a202 add temp ,2 ,rega 
-00af 204011c6 call rf_tx_write_freq 
-00b0 20401207 call txon 
-00b1 20000064 nop 100 
-00b2 204023e3 call g24_ackpayload_prep 
-00b3 20402247 call g24_transmit_prep 
-00b4 204021ff call g24_transmit + 7 
-00b5 202021d6 branch g24_receive_skip_end 
+00cf 6fe0c868 fetch 1 ,mem_24g_tx_phy 
+00d0 20401637 call le_enable_phy_by_pdata 
+00d1 6fe2483f fetch 4 ,mem_24g_addr 
+00d2 98001200 iforce access 
+00d3 20402181 call g24_prep 
+00d4 2040115d call set_sync_on 
+00d5 6848c83d fetcht 1 ,mem_24g_ch 
+00d6 708a3d12 jam 0x12 ,core_syn_top_ctrl 
+00d7 60488017 storet 1 ,mem_last_freq 
+00d8 1840a202 add temp ,2 ,rega 
+00d9 204011c6 call rf_tx_write_freq 
+00da 20401207 call txon 
+00db 20000064 nop 100 
+00dc 204023e3 call g24_ackpayload_prep 
+00dd 20402247 call g24_transmit_prep 
+00de 204021ff call g24_transmit + 7 
+00df 202021d6 branch g24_receive_skip_end 
 
 p_g24_bind_data_parse_next:
-00b6 6fe0c897 fetch 1 ,mem_24g_rxdata_temp + 2 
-00b7 c05500bb beq datatype_bind ,p_g24_bind_first_step 
-00b8 c02a80c5 beq datatype_config ,p_g24_bind_second_step 
-00b9 c01100d5 beq datatype_ok ,p_g24_bind_third_step 
-00ba 20202370 branch g24_bind_data_parse_next + 4 
+00e0 6fe0c897 fetch 1 ,mem_24g_rxdata_temp + 2 
+00e1 c05500e5 beq datatype_bind ,p_g24_bind_first_step 
+00e2 c02a80ef beq datatype_config ,p_g24_bind_second_step 
+00e3 c01100ff beq datatype_ok ,p_g24_bind_third_step 
+00e4 20202370 branch g24_bind_data_parse_next + 4 
 
 p_g24_bind_first_step:
-00bb 6fe0c898 fetch 1 ,mem_24g_rxdata_temp + 3 
-00bc c00080bf beq datatype_device1 ,p_g24_bind_first_step_device1 
-00bd c00100c2 beq datatype_device2 ,p_g24_bind_first_step_device2 
-00be 20600000 rtn 
+00e5 6fe0c898 fetch 1 ,mem_24g_rxdata_temp + 3 
+00e6 c00080e9 beq datatype_device1 ,p_g24_bind_first_step_device1 
+00e7 c00100ec beq datatype_device2 ,p_g24_bind_first_step_device2 
+00e8 20600000 rtn 
 
 p_g24_bind_first_step_device1:
-00bf 6fe0c941 fetch 1 ,mem_24g_mouse_bind_enable 
-00c0 247a0000 nrtn blank 
-00c1 20202376 branch g24_bind_first_step_device1 
+00e9 6fe0c941 fetch 1 ,mem_24g_mouse_bind_enable 
+00ea 247a0000 nrtn blank 
+00eb 20202376 branch g24_bind_first_step_device1 
 
 p_g24_bind_first_step_device2:
-00c2 6fe0c942 fetch 1 ,mem_24g_keyboard_bind_enable 
-00c3 247a0000 nrtn blank 
-00c4 2020237c branch g24_bind_first_step_device2 
+00ec 6fe0c942 fetch 1 ,mem_24g_keyboard_bind_enable 
+00ed 247a0000 nrtn blank 
+00ee 2020237c branch g24_bind_first_step_device2 
 
 p_g24_bind_second_step:
-00c5 6fe0c85e fetch 1 ,mem_24g_pair_switch 
-00c6 203a00cb branch p_g24_bind_second_step_skip ,blank 
-00c7 6fe24899 fetch 4 ,mem_24g_rxdata_temp + 4 
-00c8 684a40a8 fetcht 4 ,mem_lap 
-00c9 98467c00 isub temp ,null 
-00ca 24628000 nrtn zero 
+00ef 6fe0c85e fetch 1 ,mem_24g_pair_switch 
+00f0 203a00f5 branch p_g24_bind_second_step_skip ,blank 
+00f1 6fe24899 fetch 4 ,mem_24g_rxdata_temp + 4 
+00f2 684a40a8 fetcht 4 ,mem_lap 
+00f3 98467c00 isub temp ,null 
+00f4 24628000 nrtn zero 
 
 p_g24_bind_second_step_skip:
-00cb 6fe0c898 fetch 1 ,mem_24g_rxdata_temp + 3 
-00cc c00080cf beq datatype_device1 ,p_g24_bind_second_step_device1 
-00cd c00100d2 beq datatype_device2 ,p_g24_bind_second_step_device2 
-00ce 20600000 rtn 
+00f5 6fe0c898 fetch 1 ,mem_24g_rxdata_temp + 3 
+00f6 c00080f9 beq datatype_device1 ,p_g24_bind_second_step_device1 
+00f7 c00100fc beq datatype_device2 ,p_g24_bind_second_step_device2 
+00f8 20600000 rtn 
 
 p_g24_bind_second_step_device1:
-00cf 6fe0c941 fetch 1 ,mem_24g_mouse_bind_enable 
-00d0 247a0000 nrtn blank 
-00d1 20202389 branch g24_bind_second_step_device1 
+00f9 6fe0c941 fetch 1 ,mem_24g_mouse_bind_enable 
+00fa 247a0000 nrtn blank 
+00fb 20202389 branch g24_bind_second_step_device1 
 
 p_g24_bind_second_step_device2:
-00d2 6fe0c942 fetch 1 ,mem_24g_keyboard_bind_enable 
-00d3 247a0000 nrtn blank 
-00d4 20202394 branch g24_bind_second_step_device2 
+00fc 6fe0c942 fetch 1 ,mem_24g_keyboard_bind_enable 
+00fd 247a0000 nrtn blank 
+00fe 20202394 branch g24_bind_second_step_device2 
 
 p_g24_bind_third_step:
-00d5 6fe0c85e fetch 1 ,mem_24g_pair_switch 
-00d6 203a00db branch p_g24_bind_third_step_skip ,blank 
-00d7 6fe24899 fetch 4 ,mem_24g_rxdata_temp + 4 
-00d8 684a48d9 fetcht 4 ,mem_24g_transmitter_addr 
-00d9 98467c00 isub temp ,null 
-00da 24628000 nrtn zero 
+00ff 6fe0c85e fetch 1 ,mem_24g_pair_switch 
+0100 203a0105 branch p_g24_bind_third_step_skip ,blank 
+0101 6fe24899 fetch 4 ,mem_24g_rxdata_temp + 4 
+0102 684a48d9 fetcht 4 ,mem_24g_transmitter_addr 
+0103 98467c00 isub temp ,null 
+0104 24628000 nrtn zero 
 
 p_g24_bind_third_step_skip:
-00db 6fe0c898 fetch 1 ,mem_24g_rxdata_temp + 3 
-00dc c00080df beq datatype_device1 ,p_g24_bind_third_step_device1 
-00dd c00100e6 beq datatype_device2 ,p_g24_bind_third_step_device2 
-00de 20600000 rtn 
+0105 6fe0c898 fetch 1 ,mem_24g_rxdata_temp + 3 
+0106 c0008109 beq datatype_device1 ,p_g24_bind_third_step_device1 
+0107 c0010111 beq datatype_device2 ,p_g24_bind_third_step_device2 
+0108 20600000 rtn 
 
 p_g24_bind_third_step_device1:
-00df 6fe0c941 fetch 1 ,mem_24g_mouse_bind_enable 
-00e0 247a0000 nrtn blank 
-00e1 6fe0c882 fetch 1 ,mem_24g_device1_bind_step 
-00e2 c00100e4 beq 2 ,p_g24_bind_dvc1_step_success 
-00e3 20600000 rtn 
+0109 6fe0c941 fetch 1 ,mem_24g_mouse_bind_enable 
+010a 247a0000 nrtn blank 
+010b 6fe0c882 fetch 1 ,mem_24g_device1_bind_step 
+010c c001010e beq 2 ,p_g24_bind_dvc1_step_success 
+010d 20600000 rtn 
 
 p_g24_bind_dvc1_step_success:
-00e4 70494101 jam 1 ,mem_24g_mouse_bind_enable 
-00e5 202023a9 branch g24_bind_dvc1_step_success 
+010e 70494f04 jam 4 ,mem_g24_bind_step 
+010f 70494101 jam 1 ,mem_24g_mouse_bind_enable 
+0110 202023aa branch g24_bind_dvc1_step_success + 1 
 
 p_g24_bind_third_step_device2:
-00e6 6fe0c942 fetch 1 ,mem_24g_keyboard_bind_enable 
-00e7 247a0000 nrtn blank 
-00e8 6fe0c883 fetch 1 ,mem_24g_device2_bind_step 
-00e9 c08000eb bne 0 ,p_g24_bind_dvc2_step_success 
-00ea 20600000 rtn 
+0111 6fe0c942 fetch 1 ,mem_24g_keyboard_bind_enable 
+0112 247a0000 nrtn blank 
+0113 6fe0c883 fetch 1 ,mem_24g_device2_bind_step 
+0114 c0800116 bne 0 ,p_g24_bind_dvc2_step_success 
+0115 20600000 rtn 
 
 p_g24_bind_dvc2_step_success:
-00eb 70494201 jam 1 ,mem_24g_keyboard_bind_enable 
-00ec 202023b4 branch g24_bind_dvc2_step_success 
+0116 70494201 jam 1 ,mem_24g_keyboard_bind_enable 
+0117 202023b4 branch g24_bind_dvc2_step_success 
+
+p_g24_bind_mode_auto:
+0118 6fe0c8c3 fetch 1 ,mem_24g_work_mode 
+0119 c1808000 rtnne dongle_bind 
+011a 2040234b call g24_bind_init 
+011b 20400126 call p_g24_bind_data_process 
+011c 6fe0c8bd fetch 1 ,mem_24g_pair_mode 
+011d 247a0000 nrtn blank 
+011e 6fe0c884 fetch 1 ,mem_24g_bind_device_status 
+011f 207a0000 rtn blank 
+0120 6fe0c950 fetch 1 ,mem_g24_bind_success 
+0121 207a0000 rtn blank 
+0122 7048c000 jam 0 ,mem_24g_mode_switch 
+0123 20402493 call g24_switch_work_mode 
+0124 20402436 call g24_enable_nodata_timer 
+0125 202022b2 branch g24_timer_init 
+
+p_g24_bind_data_process:
+0126 204023fa call g24_rx_interrupt_clear 
+0127 20402187 call g24_receive_packet 
+0128 2437a3fa nbranch g24_rx_interrupt_clear ,user3 
+0129 20402367 call g24_bind_data_parse 
+
+p_g24_bind_data_process_next:
+012a 2040242c call g24_transmit_ack 
+012b 2040012d call p_g24_bind_device_status_check 
+012c 2020235f branch g24_bind_data_process + 6 
+
+p_g24_bind_device_status_check:
+012d 6fe0c950 fetch 1 ,mem_g24_bind_success 
+012e 207a0000 rtn blank 
+012f 202023d6 branch g24_bind_device_status_check 
               org 0x800
 
 start:
Index: program/patch.prog
===================================================================
--- /YC1308AF/branch/usb/USB_64K/program/patch.prog	(revision 1616)
+++ /YC1308AF/branch/usb/USB_64K/program/patch.prog	(working copy)
@@ -1,4 +1,5 @@
 define HIGH_VERSION
+//define UART_LOG
 
 	bbit1 8,pf_patch_ext
 	beq patch10_3,p_set_sync_on
@@ -22,19 +23,63 @@
 	beq patch3c_0,p_g24_receive_skip_end
 endif
 	beq patch3c_4,p_g24_bind_data_parse_next
+	beq patch3c_6,p_g24_bind_mode_auto
 	branch loop
 
 p_app_init:
 p_dongle_init:
+ifdef UART_LOG
+	call p_device_hardware_init
+endif
+	setarg p_g24_bind_continue_timer
+	store 2,mem_cb_24g_bind_continue
 	setarg p_dongle_dispatch
 	store 2,mem_cb_24g_receive_process
-	branch dongle_init+2
+	setarg dongle_g24_mouse
+	store 2,mem_cb_24g_data_device1
+	setarg dongle_g24_kb
+	store 2,mem_cb_24g_data_device2
+	setarg p_dongle_ackpayload_prep
+	store 2,mem_cb_24g_ackpayload
+	branch dongle_init+8
 
+p_g24_bind_continue_timer:
+	fetch 1,mem_g24_bind_success
+	nrtn blank
+	jam 1,mem_g24_bind_success
+	branch g24_binding_dvc1_living
+	
 p_dongle_dispatch:
 	fetch 1,mem_24g_pair_mode
+	beq 0x00,p_dongle_auto_bind
+	beq 0x01,dongle_pc_bind
 	beq 0x0f,p_dongle_all_powerful
-	branch dongle_dispatch+1
-		
+	rtn
+
+p_dongle_auto_bind:
+	call g24_mode_switch_init
+p_dongle_auto_bind_loop:
+	call g24_mode_switch_bind_work
+	call g24_mode_switch_bind_search
+	call dongle_work_mode_auto
+	call g24_bind_mode_auto
+	call g24_search_mode_auto
+	call dongle_usb_dispatch
+	call p_timer_check
+	branch p_dongle_auto_bind_loop
+
+p_dongle_ackpayload_prep:
+	fetch 1,mem_g24_bind_step
+	beq 4,p_g24_bind_dvc1_exit
+p_dongle_ackpayload_prep_end:
+	branch dongle_ackpayload_prep
+
+p_g24_bind_dvc1_exit:
+	jam DONGLE_BIND,mem_24g_work_mode
+	jam 1,mem_g24_bind_continue_enable
+	call p_timer_init
+	branch p_dongle_ackpayload_prep_end
+	
 
 /************************rf patch start**********/
 p_set_sync_on:
@@ -226,6 +271,22 @@
 	rtn
 	
 
+p_timer_init:
+	arg 13,queue
+	setarg 80
+	branch timer_init
+
+p_timer_check:
+	fetch 1,mem_g24_bind_continue_enable
+	rtn blank
+	arg 13,queue
+	call timer_check
+	nrtn blank
+	jam 0,mem_g24_bind_continue_enable
+	//call p_timer_init
+	fetch 2,mem_cb_24g_bind_continue
+	branch callback_func
+
 
 p_usb_init:
 	call enable_authrom
@@ -306,6 +367,7 @@
 	fetch 1,mem_24g_mouse_bind_enable
 	nrtn blank
 	branch g24_bind_first_step_device1
+	
 p_g24_bind_first_step_device2:
 	fetch 1,mem_24g_keyboard_bind_enable
 	nrtn blank
@@ -351,9 +413,10 @@
 	beq 2,p_g24_bind_dvc1_step_success
 	rtn
 p_g24_bind_dvc1_step_success:
+	jam 4,mem_g24_bind_step
 	jam 1,mem_24g_mouse_bind_enable	
-	branch g24_bind_dvc1_step_success
-
+	branch g24_bind_dvc1_step_success+1
+	 
 p_g24_bind_third_step_device2:
 	fetch 1,mem_24g_keyboard_bind_enable
 	nrtn blank
@@ -364,6 +427,41 @@
 	jam 1,mem_24g_keyboard_bind_enable
 	branch g24_bind_dvc2_step_success
 
+p_g24_bind_mode_auto:
+	fetch 1,mem_24g_work_mode
+	rtnne DONGLE_BIND
+	call g24_bind_init
+	call p_g24_bind_data_process
+	fetch 1,mem_24g_pair_mode
+	nrtn blank
+	fetch 1,mem_24g_bind_device_status
+	rtn blank
+
+	fetch 1,mem_g24_bind_success
+	rtn blank
+	
+	jam 0,mem_24g_mode_switch		//after bind timer
+	call g24_switch_work_mode
+	call g24_enable_nodata_timer
+	branch g24_timer_init
+
+p_g24_bind_data_process:
+	call g24_rx_interrupt_clear
+	call g24_receive_packet
+	nbranch g24_rx_interrupt_clear,user3
+	call g24_bind_data_parse	
+p_g24_bind_data_process_next:
+	call g24_transmit_ack
+ifdef UART_LOG
+	call p_24g_payload_print
+endif
+	call p_g24_bind_device_status_check
+	branch g24_bind_data_process+6
+	
+p_g24_bind_device_status_check:
+	fetch 1,mem_g24_bind_success
+	rtn blank
+	branch g24_bind_device_status_check
 
 /*
 p_g24_end_of_packet:
@@ -416,7 +514,7 @@
 	branch g24_end_of_packet,user7
 	call g24_receive_byte
 	store 1,mem_24g_rxbuf	//device id
-	bmark1 mark_24g_rxmode,g24_receive_skip
+	bmark1 mark_24g_rxmode,p_g24_receive_skip
 	fetch 1,mem_24g_rxbuf
 	fetcht 1,mem_24g_data_type
 	icompare bits_data,temp
@@ -461,4 +559,116 @@
 	branch p_g24_receive_skip_next
 */
 
+ifdef UART_LOG
+p_device_hardware_init:
+	fetch 1,core_uart_ctrl
+	set0 BIT_UART_CONTROL_ENABLE,pdata
+	store 1,core_uart_ctrl
+	fetch 8,mem_device_uart_rx_buffer
+	call uarta_init_dma_mem
+	fetch uart_baud_len,mem_device_uart_baud_rate
+	call uarta_init_baud_rate
+	call uart_clock_select_main_freq_crystal
+	fetch 1,mem_device_uart_tx_gpio
+	arg gpcfg_uart_txd,temp
+	call gpio_config_function_int
+	fetch 1,mem_device_uart_rx_gpio
+	arg gpcfg_uart_rxd|gpcfg_pullup,temp
+	call gpio_config_function_int
+	arg FUN_UART_CONTROL_ENABLE|FUN_UART_CONTROL_SETTING_RATE_BAUD,temp
+	storet 1,core_uart_ctrl
+	rtn
+
+
+p_24g_payload_print:
+	arg 8,loopcnt
+	arg mem_24g_txpayload+3,regc
+	call log_bytes
+	branch log_end
+	
+
+//input: 1 byte hex @pdata  
+//output: 4 byte  '0','x', ASCII,ASCII, @pdata
+hex2ascii:
+	rshift4 pdata,rega  //high 4bit in rega
+	and_into 0x0f,pdata
+	call hex2ascii_half_byte
+	copy pdata,regb
+	copy rega,pdata
+	call hex2ascii_half_byte
+	lshift8 regb,regb
+	iadd regb,pdata
+//	lshift16 pdata,pdata
+//	arg 0x7830,regb   //0x
+//	iadd regb,pdata
+	rtn
+
+//input: 1 byte hex @pdata  
+//output: 4 byte  '0','x', ASCII,ASCII, @pdata
+hex2ascii_half_byte:
+	arg 0xa,temp
+	isub temp,temp
+	nbranch hex2ascii_half_byte_numberic,positive
+	setarg 0x41  // A
+	iadd temp,pdata
+	rtn
+hex2ascii_half_byte_numberic:
+	arg 0x30,temp
+	iadd temp,pdata
+	rtn
+
+//input: loopcnt--length,regc--data ptr	
+log_bytes:
+	copy loopcnt,pdata
+	branch log_len0,blank
+log_bytes_loop:
+	ifetch 1,regc
+	increase 1,regc
+	call log_byte
+	call log_space
+	loop log_bytes_loop
+uart_wait:
+	fetch 1,core_uart_status
+	bbit1 uart_status_tx_busy,uart_wait
+//	nop 12000
+	rtn	
+
+log_len0:
+	call uarta_prepare_tx
+	setarg 0x656c
+	istore 2,contwu
+	setarg 0x306e
+	istore 2,contwu
+	call uarta_send
+	branch log_end
+
+//input 1byte @pdata
+log_byte:
+	call uarta_prepare_tx
+	call hex2ascii
+//	istore 4,contu	//0x
+	istore 2,contwu
+	branch uarta_send
+
+log_space:
+	call uarta_prepare_tx
+	setarg 0x20
+	istore 1,contwu
+	branch uarta_send
+
+log_end:
+	call uarta_prepare_tx
+	setarg 0x0a0d
+	istore 2,contwu
+	branch uarta_send
+
+log_colon:
+	call uarta_prepare_tx
+	setarg 0x3a
+	istore 1,contwu
+	branch uarta_send
+
+endif
+
+
 
Index: sched/dongle.dat
===================================================================
--- /YC1308AF/branch/usb/USB_64K/sched/dongle.dat	(revision 1616)
+++ /YC1308AF/branch/usb/USB_64K/sched/dongle.dat	(working copy)
@@ -37,7 +37,7 @@
 #mem_24g_ch_map2:06 15 36 48
 #mem_24g_ch_map3:0f 1a 3a 4c
 #mem_24g_ch_map4:11 23 31 4d
-#mem_24g_pair_switch:00
+mem_24g_pair_switch:01
 #mem_24g_pair_mode:00
 #mem_24g_pair_ch:4e
 #mem_24g_pair_tx_power:85
@@ -61,3 +61,19 @@
 mem_lpm_ctrim:14		#xtal offset
 
 
+
+#log log log log log log log log log log log
+
+#uart config
+#mem_device_uart_tx_gpio:08	#08
+#mem_device_uart_rx_gpio:ff
+#mem_device_uart_baud_rate:d0 00	#115200	
+#mem_device_uart_rx_buffer:00 1c
+#mem_device_uart_rx_buffer_end:ff 1f
+#mem_device_uart_tx_buffer:00 4f
+#mem_device_uart_tx_buffer_end:ff 4f
+
+#mem_rf_debug_rx_gpio:88
+#mem_rf_debug_tx_gpio:88
+
+
