;Hand Data Terminal for FADEC
include "P16f627a.inc"
__CONFIG 0x1f14
lcdbuf equ 0x20 ;0x20...0x3f 32bytes for LCD buffer
;-----------------------------global registers starting at 0x70------------------------------
rxbuf equ 0x70 ;serial reception buffer
debounce equ 0x71 ;debounce counter for keys
txbuf equ
0x72 ;transmit buffer holds code to be sent when
key pressed
txcnt equ 0x73 ;transmitted byte counter
W_temp equ 0x74
STA_temp equ 0x75
FSR_temp equ 0x76
rxcnt equ 0x77 ;received byte counter
delay_h equ 0x78
delay_l equ 0x79
lcdcnt equ 0x7a
baud_h equ 0x7b
baud_l equ 0x7c
baudcnt equ 0x7d
remap equ 0x7e ;temporary register for remapping characters
org 0
GOTO starthere
org 0x04
isr0
BTFSS STATUS, RP0
GOTO isr1
BCF STATUS, RP0
MOVWF W_temp
BSF STATUS, RP0
MOVF STATUS, W
BCF STATUS, RP0
GOTO isr2
isr1
MOVWF W_temp
MOVF STATUS, W
isr2
MOVWF STA_temp
MOVF FSR, W
MOVWF FSR_temp
BCF STATUS, RP0
BTFSS INTCON, RBIF
GOTO isr7
BSF STATUS, RP0
BSF TRISB, 0x04
BSF TRISB, 0x05
BSF TRISB, 0x06
BSF TRISB, 0x07
BCF OPTION_REG, NOT_RBPU
BCF STATUS, RP0
MOVF PORTB, W
BCF INTCON, RBIF
COMF PORTB, W
ANDLW 0xf0
BTFSC STATUS, Z
GOTO isr6
MOVLW 0x04
MOVWF debounce
;check for pressed keys
BTFSC PORTB, 0x07
GOTO isr3
MOVLW 0x41 ;DATA + pressed, send 0x41
MOVWF txbuf
GOTO isr5
isr3
BTFSC PORTB, 0x06
GOTO isr4
MOVLW 0x42 ;DATA - pressed, send 0x42
MOVWF txbuf
GOTO isr5
isr4
BTFSS PORTB, 0x05
MOVLW 0x44 ;MENU - pressed, send 0x44
BTFSS PORTB, 0x04
MOVLW 0x43 ;MENU + pressed, send 0x43
isr5
MOVWF txbuf
CLRF txcnt
MOVLW 0xde ;
MOVWF TXREG
BSF STATUS, RP0 ;enable serial transmit interrupt
BSF PIE1, TXIE
BCF STATUS, RP0
isr6
BCF INTCON, RBIF
;Serial communication interrupt
isr7
BTFSS PIR1, RCIF
GOTO isr13
CLRWDT
MOVF RCREG, W
MOVWF rxbuf ;store received byte in rxbuf
MOVF rxcnt, W
BTFSS STATUS, Z
GOTO isr8
MOVF rxbuf, W ;check for first data block alignment byte
SUBLW 0xfc
BTFSS STATUS, Z
GOTO isr12
INCF rxcnt, F
GOTO isr12
isr8
DECF rxcnt, W
BTFSS STATUS, Z
GOTO isr9
MOVF rxbuf, W ;check for second data block alignment byte
SUBLW 0xfd
BTFSS STATUS, Z
GOTO isr11
INCF rxcnt, F
GOTO isr12
isr9
MOVF rxcnt, W ;store receiverd serial data to RAM starting at 0x20
ADDLW (lcdbuf - 2) ;(0x1e + 2)
MOVWF FSR
MOVF rxbuf, W
MOVWF INDF
INCF rxcnt, F
MOVLW 0x32
SUBWF rxcnt, W
BTFSS STATUS, Z
GOTO isr12
CLRF rxcnt
MOVLW 0x4
SUBWF txcnt, W
BTFSS STATUS, Z
GOTO isr12
BTFSS PORTB, 0x6
GOTO isr10
BTFSC PORTB, 0x7
GOTO isr12
isr10
DECFSZ debounce, F
GOTO isr12
INCF debounce, F
CLRF txcnt
MOVLW 0xde
MOVWF TXREG
BSF STATUS, RP0
BSF PIE1, TXIE
BCF STATUS, RP0
GOTO isr12
isr11
CLRF rxcnt
isr12
BCF PIR1, RCIF
isr13
BTFSS PIR1, TXIF
GOTO isr18
BSF STATUS, RP0
BTFSS PIE1, TXIE
GOTO isr18
BCF STATUS, RP0
MOVF txcnt, W
BTFSS STATUS, Z
GOTO isr14
MOVLW 0xdf
MOVWF TXREG
INCF txcnt, F
GOTO isr17
isr14
DECF txcnt, W
BTFSS STATUS, Z
GOTO isr15
MOVLW 0x70
MOVWF TXREG
INCF txcnt, F
GOTO isr17
isr15
MOVLW 0x2
SUBWF txcnt, W
BTFSS STATUS, Z
GOTO isr16
MOVF txbuf, W
MOVWF TXREG
INCF txcnt, F
GOTO isr17
isr16
MOVLW 0x70
ADDWF txbuf, W
MOVWF TXREG
INCF txcnt, F
BSF STATUS, RP0
BCF PIE1, TXIE
BCF STATUS, RP0
isr17
BCF PIR1, TXIF
isr18
BCF STATUS, RP0
MOVF FSR_temp, W
MOVWF FSR
MOVF STA_temp, W
MOVWF STATUS
MOVF W_temp, W
RETFIE
;--------------------------------------initialisation-------------------------------------------
;main code starts here
; org 0x9a
starthere
BCF INTCON, GIE
BSF STATUS, RP0
MOVLW 0xf7
MOVWF TRISB
MOVLW 0x10
MOVWF TRISA ;make PORTA,4 input
; BSF TRISB, 0x0
; BSF TRISB, 0x4
; BSF TRISB, 0x5
; BSF TRISB, 0x6
; BSF TRISB, 0x7
BCF OPTION_REG, NOT_RBPU
BCF STATUS, RP0
MOVLW 0x20
MOVWF FSR
init1 ;clear RAM page 0
CLRF INDF
INCF FSR, F
MOVF FSR, W
SUBLW 0x7f
BTFSS STATUS, Z
GOTO init1
CLRF PORTA ;Initialize PORTA by
;setting
;output data latches
MOVLW 0x07 ;Turn comparators off and
MOVWF CMCON ;enable pins for I/O
;functions
; BSF STATUS, RP0
; MOVLW 0x10
; MOVWF TRISA ;make PORTA,4 input
; BSF TRISB, 0
; BCF TRISB, 3
; BCF STATUS, RP0
BCF PORTB, 3
CLRF PORTA
CALL wait200
CALL wait200
MOVLW 0x03 ;initialise LCD
MOVWF PORTA
CALL lcd_strobe
CALL wait200
CALL lcd_strobe
CALL wait1d5
CALL lcd_strobe
CALL wait1d5
MOVLW 0x02
MOVWF PORTA
CALL lcd_strobe
CALL wait1d5
MOVLW 0x28
CALL lcd_cntl
CALL wait1d5
MOVLW 0x0c
CALL lcd_cntl
CALL wait1d5
MOVLW 0x06
CALL lcd_cntl
CALL wait1d5
; display start screen from table
strtscrn
MOVLW 0x01
MOVWF lcdcnt
strtscrn1
MOVLW 0x4f ;from 0x50~0x6f to display start screen
MOVWF baud_l
strtscrn2
INCF baud_l, F
MOVF baud_l, W
MOVWF FSR
MOVF baudcnt, W
CALL table
MOVWF INDF
INCF baudcnt, F
MOVF baudcnt, W
SUBLW 0x20
BTFSC STATUS, Z
GOTO strtscrn3
GOTO strtscrn2
strtscrn3
CALL fb2lcd
CALL wait200
DECFSZ lcdcnt, F
GOTO strtscrn1
;auto baud routine
baud
; GOTO baud10 ;***skip auto baud -- manual selection
MOVLW 0x19
MOVWF baudcnt
baud0 ;wait for some activity on the RxD line (24 cycles)
DECFSZ baudcnt, F
GOTO baud1
GOTO baud4 ;after 24 cycles start actual measurement
baud1
CLRWDT
baud2 ;wait till RxD is low
BTFSC PORTB, 0
GOTO baud2
baud3
BTFSS PORTB, 0 ;wait till RxD is high
GOTO baud3
GOTO baud0
;--------------------------- after 24 signal toggles on RxD come here, RxD is high ------------------------
baud4
MOVLW 0xff
MOVWF baud_h
MOVWF baud_l
MOVLW 0x19
MOVWF baudcnt
baud5
DECFSZ baudcnt, F
GOTO baud6
GOTO baud10
baud6
MOVLW 0x20
MOVWF T1CON ;run timer 1 at 1/4 Fcyc
CLRF TMR1L
CLRF TMR1H
baud7
BTFSC PORTB, 0 ;wait till RxD goes low
GOTO baud7
BSF T1CON, 0 ;start timer1
baud8
BTFSS PORTB, 0
GOTO baud8 ;wait till RxD goes high
BCF T1CON, 0 ;stop timer1
MOVF TMR1L, W
SUBWF baud_l, W
MOVF TMR1H, W
BTFSS STATUS, C
INCF TMR1H, W
SUBWF baud_h, W
BTFSS STATUS, C
GOTO baud9
MOVF TMR1L, W
MOVWF baud_l
MOVF TMR1H, W
MOVWF baud_h
baud9
GOTO baud5
baud10 ;baud rate is evaluated
MOVF baud_l, W
BSF STATUS, RP0
; MOVLW 103 ;*** test 2400 Baud manually
MOVWF SPBRG ;write baud rate register
BSF TXSTA, TXEN ;configure serial port
BSF TXSTA, BRGH
BSF TRISB, 1
BSF TRISB, 2
BCF PIE1, TXIE
BSF PIE1, RCIE
BCF STATUS, RP0
BSF RCSTA, SPEN
BSF RCSTA, CREN
BSF INTCON, PEIE ;enable interrupts
BSF INTCON, GIE
;-----------------------------from here interrupts are active---------------------------------
;here we go
rxlcd1
MOVLW 0x22
SUBWF rxcnt, W
BTFSS STATUS, Z
GOTO rxlcd1 ;wait until 34 bytes of data have been received
MOVLW 0x1f
MOVWF lcdcnt
rxlcd2
;copy displayable part of received data to frame buffer RAM
INCF lcdcnt, F
MOVF lcdcnt, W
MOVWF FSR
MOVF INDF, W
MOVWF baud_h
MOVLW 0x30
ADDWF FSR, F
MOVF baud_h, W
MOVWF INDF
MOVF lcdcnt, W
SUBLW 0x3f
BTFSS STATUS, Z
GOTO rxlcd2
CALL fb2lcd
GOTO rxlcd1
;subroutines start here
;delay by 200ms
wait200
MOVLW 0xff
MOVWF delay_h
CLRF delay_l
wait2001
DECFSZ delay_l, F
GOTO wait2001
DECFSZ delay_h, F
GOTO wait2001
RETURN
;delay by 1.5ms
wait1d5
MOVLW 0x2
MOVWF delay_h
CLRF delay_l
wait1d51
DECFSZ delay_l, F
GOTO wait1d51
DECFSZ delay_h, F
GOTO wait1d51
RETURN
;copy frame buffer contents to LCD
fb2lcd
MOVLW 0x80
CALL lcd_cntl ;move cursor to address 0
CLRF baudcnt
MOVLW 0x4f
MOVWF baud_l
fb2lcd1
INCF baud_l, F
MOVF baud_l, W
MOVWF FSR
MOVF INDF, W
CALL lcd_write
INCF baudcnt, F
MOVF baudcnt, W
SUBLW 0x10
BTFSC STATUS, Z
GOTO fb2lcd2
GOTO fb2lcd1
fb2lcd2
MOVLW 0xc0 ;***LCD second line
;was MOVLW 0xa8
CALL lcd_cntl
fb2lcd3
INCF baud_l, F
MOVF baud_l, W
MOVWF FSR
MOVF INDF, W
CALL lcd_write
INCF baudcnt, F
MOVF baudcnt, W
SUBLW 0x20
BTFSC STATUS, Z
GOTO fb2lcd4
GOTO fb2lcd3
fb2lcd4
RETURN
;send enable to LCD (E)
lcd_strobe
BSF PORTA, 7
NOP
NOP
NOP
BCF PORTA, 7
RETURN
;send control byte to LCD
lcd_cntl
BCF PORTB,3
MOVWF delay_l
SWAPF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
MOVF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
CALL wait1d5
CALL wait1d5
CALL wait1d5
RETURN
;send displayable data byte to LCD
lcd_write
;-------- character remapping for " " and " " for PowerTip LCD ---------------
MOVWF remap ;temporarily store value
SUBLW 0xdf ;check for " " character
BTFSS STATUS,Z
GOTO remap1
MOVLW 0xd2
GOTO remap3
remap1
MOVF remap,W
SUBLW 0xe4 ;check for " " character
BTFSS STATUS,Z
GOTO remap2
MOVLW 0xc8
GOTO remap3
remap2
MOVF remap,W
remap3
;--------------------------- character remapping finished -----------------------------
BSF PORTB, 3
MOVWF delay_l
SWAPF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
MOVF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
CALL wait1d5
BCF PORTB, 3
RETURN
;start screen lookup table
org 0x300
table
MOVWF baud_h
MOVLW 0x3
MOVWF PCLATH
MOVF baud_h, W
ADDWF PCL, F
RETLW 0x54 ;T
RETLW 0x65 ;e
RETLW 0x72 ;r
RETLW 0x6d ;m
RETLW 0x69 ;i
RETLW 0x6e ;n
RETLW 0x61 ;a
RETLW 0x6c ;l
RETLW 0x20 ;_
RETLW 0x56 ;V
RETLW 0x20 ;_
RETLW 0x31 ;1
RETLW 0x2e ;.
RETLW 0x31 ;1
RETLW 0x20 ;_
RETLW 0x20 ;_
RETLW 0x43 ;C
RETLW 0x6f ;o
RETLW 0x6e ;n
RETLW 0x6e ;n
RETLW 0x65 ;e
RETLW 0x63 ;c
RETLW 0x74 ;t
RETLW 0x69 ;i
RETLW 0x6e ;n
RETLW 0x67 ;g
RETLW 0x2e ;.
RETLW 0x2e ;.
RETLW 0x2e ;.
RETLW 0x20 ;_
RETLW 0x20 ;_
RETLW 0x20 ;_
O0hhbmQgRGF0YSBUZXJtaW5hbCBmb3IgRkFERUMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ICAgICAgICAgcCA9IDE2ZjYyN2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlICJQMTZmNjI3YS5pbmMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DT05GSUcgICAweDFmMTQKCmxjZGJ1ZiAgICAgICAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4MjAgICAgICAgICAgICAgICAgICAgIDsweDIwLi4uMHgzZiAzMmJ5dGVzIGZvciBMQ0QgYnVmZmVyCgo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1nbG9iYWwgcmVnaXN0ZXJzIHN0YXJ0aW5nIGF0IDB4NzAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnJ4YnVmICAgICAgICAgICAgICAgICAgICBlcXUgICAgICAgICAgICAgICAgICAgICAgMHg3MCAgICAgICAgICAgICAgICAgICAgO3NlcmlhbCByZWNlcHRpb24gYnVmZmVyCmRlYm91bmNlICAgICAgICAgIGVxdSAgICAgICAgICAgICAgICAgICAgICAweDcxICAgICAgICAgICAgICAgICAgICA7ZGVib3VuY2UgY291bnRlciBmb3Iga2V5cwp0eGJ1ZiAgICAgICAgICAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4NzIgICAgICAgICAgICAgICAgICAgIDt0cmFuc21pdCBidWZmZXIgaG9sZHMgY29kZSB0byBiZSBzZW50IHdoZW4ga2V5IHByZXNzZWQKdHhjbnQgICAgICAgICAgICAgICAgICAgIGVxdSAgICAgICAgICAgICAgICAgICAgICAweDczICAgICAgICAgICAgICAgICAgICA7dHJhbnNtaXR0ZWQgYnl0ZSBjb3VudGVyCldfdGVtcCAgICAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4NzQKU1RBX3RlbXAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4NzUKRlNSX3RlbXAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4NzYKcnhjbnQgICAgICAgICAgICAgICAgICAgIGVxdSAgICAgICAgICAgICAgICAgICAgICAweDc3ICAgICAgICAgICAgICAgICAgICA7cmVjZWl2ZWQgYnl0ZSBjb3VudGVyCmRlbGF5X2ggICAgICAgICAgICAgICBlcXUgICAgICAgICAgICAgICAgICAgICAgMHg3OApkZWxheV9sICAgICAgICAgICAgICAgIGVxdSAgICAgICAgICAgICAgICAgICAgICAweDc5CmxjZGNudCAgICAgICAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4N2EKYmF1ZF9oICAgICAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4N2IKYmF1ZF9sICAgICAgICAgICAgICAgIGVxdSAgICAgICAgICAgICAgICAgICAgICAweDdjCmJhdWRjbnQgICAgICAgICAgICAgZXF1ICAgICAgICAgICAgICAgICAgICAgIDB4N2QKcmVtYXAgICAgICAgICAgICAgICAgIGVxdSAgICAgICAgICAgICAgICAgICAgICAweDdlICAgICAgICAgICAgICAgICAgICA7dGVtcG9yYXJ5IHJlZ2lzdGVyIGZvciByZW1hcHBpbmcgY2hhcmFjdGVycwoKICAgICAgICAgICAgICAgb3JnICAgICAgICAgMAogICAgICAgICAgICAgICBHT1RPICAgc3RhcnRoZXJlICAgICAgICAgICAgCgogICAgICAgICAgICAgICBvcmcgICAgICAgICAweDA0CmlzcjAKICAgICAgICAgICAgICAgQlRGU1MgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBpc3IxICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBCQ0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgV190ZW1wCiAgICAgICAgICAgICAgIEJTRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAKICAgICAgICAgICAgICAgTU9WRiAgIFNUQVRVUywgICAgICAgICAgICAgIFcgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBCQ0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgaXNyMiAgICAgICAgICAgICAgICAgICAgICAKCmlzcjEKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIFdfdGVtcAogICAgICAgICAgICAgICBNT1ZGICAgU1RBVFVTLCAgICAgICAgICAgICAgVyAgICAgICAgICAgICAgICAgICAgICAgICAgCgppc3IyCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBTVEFfdGVtcAogICAgICAgICAgICAgICBNT1ZGICAgRlNSLCAgICAgIFcgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgRlNSX3RlbXAKICAgICAgICAgICAgICAgQkNGICAgICAgIFNUQVRVUywgICAgICAgICAgICAgIFJQMCAgICAgICAKICAgICAgICAgICAgICAgQlRGU1MgICBJTlRDT04sICAgICAgICAgICAgUkJJRiAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgaXNyNyAgICAgICAgCiAgICAgICAgICAgICAgIEJTRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCiAgICAgICAgICAgICAgIEJTRiAgICAgICBUUklTQiwgIDB4MDQgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBCU0YgICAgICAgVFJJU0IsICAweDA1ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQlNGICAgICAgIFRSSVNCLCAgMHgwNiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEJTRiAgICAgICBUUklTQiwgIDB4MDcgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBCQ0YgICAgICAgT1BUSU9OX1JFRywgIE5PVF9SQlBVCiAgICAgICAgICAgICAgIEJDRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCiAgICAgICAgICAgICAgIE1PVkYgICBQT1JUQiwgICAgICAgICAgICAgICBXCiAgICAgICAgICAgICAgIEJDRiAgICAgICBJTlRDT04sICAgICAgICAgICAgUkJJRgogICAgICAgICAgICAgICBDT01GICAgUE9SVEIsICAgICAgICAgICAgICAgVwogICAgICAgICAgICAgICBBTkRMVyAgICAgICAgICAgICAgIDB4ZjAKICAgICAgICAgICAgICAgQlRGU0MgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjYgICAgICAgIAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHgwNCAgICAgCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBkZWJvdW5jZQoKO2NoZWNrIGZvciBwcmVzc2VkIGtleXMKICAgICAgICAgICAgICAgQlRGU0MgIFBPUlRCLCAgICAgICAgICAgICAgIDB4MDcKICAgICAgICAgICAgICAgR09UTyAgIGlzcjMKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4NDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtEQVRBICsgcHJlc3NlZCwgc2VuZCAweDQxCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICB0eGJ1ZgogICAgICAgICAgICAgICBHT1RPICAgaXNyNSAgICAgICAgCmlzcjMKICAgICAgICAgICAgICAgQlRGU0MgIFBPUlRCLCAgICAgICAgICAgICAgIDB4MDYKICAgICAgICAgICAgICAgR09UTyAgIGlzcjQgICAgICAgIAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHg0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO0RBVEEgLSBwcmVzc2VkLCBzZW5kIDB4NDIKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIHR4YnVmCiAgICAgICAgICAgICAgIEdPVE8gICBpc3I1ICAgICAgICAKaXNyNAogICAgICAgICAgICAgICBCVEZTUyAgIFBPUlRCLCAgICAgICAgICAgICAgIDB4MDUKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4NDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtNRU5VIC0gcHJlc3NlZCwgc2VuZCAweDQ0CiAgICAgICAgICAgICAgIEJURlNTICAgUE9SVEIsICAgICAgICAgICAgICAgMHgwNAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHg0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO01FTlUgKyBwcmVzc2VkLCBzZW5kIDB4NDMKCmlzcjUKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIHR4YnVmCiAgICAgICAgICAgICAgIENMUkYgICAgIHR4Y250ICAgICAKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4ZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIFRYUkVHICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBCU0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtlbmFibGUgc2VyaWFsIHRyYW5zbWl0IGludGVycnVwdAogICAgICAgICAgICAgICBCU0YgICAgICAgUElFMSwgICAgIFRYSUUKICAgICAgICAgICAgICAgQkNGICAgICAgIFNUQVRVUywgICAgICAgICAgICAgIFJQMCAgICAgICAKaXNyNgogICAgICAgICAgICAgICBCQ0YgICAgICAgSU5UQ09OLCAgICAgICAgICAgIFJCSUYKCjtTZXJpYWwgY29tbXVuaWNhdGlvbiBpbnRlcnJ1cHQKaXNyNwogICAgICAgICAgICAgICBCVEZTUyAgIFBJUjEsICAgICBSQ0lGCiAgICAgICAgICAgICAgIEdPVE8gICBpc3IxMyAgICAgCiAgICAgICAgICAgICAgIENMUldEVCAgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgUkNSRUcsICAgICAgICAgICAgICBXCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICByeGJ1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7c3RvcmUgcmVjZWl2ZWQgYnl0ZSBpbiByeGJ1ZgogICAgICAgICAgICAgICBNT1ZGICAgcnhjbnQsICAgIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjgKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIE1PVkYgICByeGJ1ZiwgICAgVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Y2hlY2sgZm9yIGZpcnN0IGRhdGEgYmxvY2sgYWxpZ25tZW50IGJ5dGUKICAgICAgICAgICAgICAgU1VCTFcgMHhmYwogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjEyICAgICAKICAgICAgICAgICAgICAgSU5DRiAgICAgcnhjbnQsICAgIEYgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBpc3IxMiAgICAgCmlzcjgKICAgICAgICAgICAgICAgREVDRiAgICByeGNudCwgICAgVyAgICAgICAgICAgCiAgICAgICAgICAgICAgIEJURlNTICAgU1RBVFVTLCAgICAgICAgICAgICAgWiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgaXNyOSAgICAgICAgCiAgICAgICAgICAgICAgIE1PVkYgICByeGJ1ZiwgICAgVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Y2hlY2sgZm9yIHNlY29uZCBkYXRhIGJsb2NrIGFsaWdubWVudCBieXRlCiAgICAgICAgICAgICAgIFNVQkxXIDB4ZmQKICAgICAgICAgICAgICAgQlRGU1MgICBTVEFUVVMsICAgICAgICAgICAgICBaICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBpc3IxMSAgICAgCiAgICAgICAgICAgICAgIElOQ0YgICAgIHJ4Y250LCAgICBGICAgICAgICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgaXNyMTIgICAgIAppc3I5CiAgICAgICAgICAgICAgIE1PVkYgICByeGNudCwgICAgVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7c3RvcmUgcmVjZWl2ZXJkIHNlcmlhbCBkYXRhIHRvIFJBTSBzdGFydGluZyBhdCAweDIwCiAgICAgICAgICAgICAgIEFERExXICAgICAgICAgICAgICAgKGxjZGJ1ZiAtIDIpICAgICAgICAgICAgICAgICAgICAgICA7KDB4MWUgKyAyKQogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgRlNSICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgcnhidWYsICAgIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgSU5ERgogICAgICAgICAgICAgICBJTkNGICAgICByeGNudCwgICAgRiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4MzIKICAgICAgICAgICAgICAgU1VCV0YgICAgICAgICAgICAgICByeGNudCwgICAgVwogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjEyICAgICAKICAgICAgICAgICAgICAgQ0xSRiAgICAgcnhjbnQgICAgIAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHg0ICAgICAgICAKICAgICAgICAgICAgICAgU1VCV0YgICAgICAgICAgICAgICB0eGNudCwgICAgVwogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjEyICAgICAKICAgICAgICAgICAgICAgQlRGU1MgICBQT1JUQiwgICAgICAgICAgICAgICAweDYKICAgICAgICAgICAgICAgR09UTyAgIGlzcjEwICAgICAKICAgICAgICAgICAgICAgQlRGU0MgIFBPUlRCLCAgICAgICAgICAgICAgIDB4NwogICAgICAgICAgICAgICBHT1RPICAgaXNyMTIgICAgIAppc3IxMAogICAgICAgICAgICAgICBERUNGU1ogICAgICAgICAgICAgIGRlYm91bmNlLCAgICAgICAgIEYgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjEyICAgICAKICAgICAgICAgICAgICAgSU5DRiAgICAgZGVib3VuY2UsICAgICAgICAgRiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQ0xSRiAgICAgdHhjbnQgICAgIAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHhkZQogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgVFhSRUcgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEJTRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCiAgICAgICAgICAgICAgIEJTRiAgICAgICBQSUUxLCAgICAgVFhJRQogICAgICAgICAgICAgICBCQ0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgaXNyMTIgICAgIAoKCmlzcjExCiAgICAgICAgICAgICAgIENMUkYgICAgIHJ4Y250ICAgICAKaXNyMTIKICAgICAgICAgICAgICAgQkNGICAgICAgIFBJUjEsICAgICBSQ0lGCmlzcjEzCiAgICAgICAgICAgICAgIEJURlNTICAgUElSMSwgICAgIFRYSUYgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBpc3IxOCAgICAgCiAgICAgICAgICAgICAgIEJTRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCiAgICAgICAgICAgICAgIEJURlNTICAgUElFMSwgICAgIFRYSUUgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjE4ICAgICAKICAgICAgICAgICAgICAgQkNGICAgICAgIFNUQVRVUywgICAgICAgICAgICAgIFJQMCAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIHR4Y250LCAgICBXICAgICAgICAgICAKICAgICAgICAgICAgICAgQlRGU1MgICBTVEFUVVMsICAgICAgICAgICAgICBaICAgICAgICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgaXNyMTQgICAgIAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHhkZgogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgVFhSRUcgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIElOQ0YgICAgIHR4Y250LCAgICBGICAgICAgICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgaXNyMTcgICAgIAoKCmlzcjE0CiAgICAgICAgICAgICAgIERFQ0YgICAgdHhjbnQsICAgIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjE1ICAgICAKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4NzAKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIFRYUkVHICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBJTkNGICAgICB0eGNudCwgICAgRiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjE3ICAgICAKCgppc3IxNQogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHgyICAgICAgICAKICAgICAgICAgICAgICAgU1VCV0YgICAgICAgICAgICAgICB0eGNudCwgICAgVwogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjE2ICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIHR4YnVmLCAgICBXICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIFRYUkVHICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBJTkNGICAgICB0eGNudCwgICAgRiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGlzcjE3ICAgICAKCgppc3IxNgogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHg3MAogICAgICAgICAgICAgICBBRERXRiAgICAgICAgICAgICAgIHR4YnVmLCAgICBXCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBUWFJFRyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgSU5DRiAgICAgdHhjbnQsICAgIEYgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEJTRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCiAgICAgICAgICAgICAgIEJDRiAgICAgICBQSUUxLCAgICAgVFhJRQogICAgICAgICAgICAgICBCQ0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwCmlzcjE3CiAgICAgICAgICAgICAgIEJDRiAgICAgICBQSVIxLCAgICAgVFhJRgppc3IxOAogICAgICAgICAgICAgICBCQ0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgRlNSX3RlbXAsICAgICAgICAgVyAgICAgICAgICAgCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBGU1IgICAgICAgCiAgICAgICAgICAgICAgIE1PVkYgICBTVEFfdGVtcCwgICAgICAgICBXICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIFNUQVRVUyAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgV190ZW1wLCAgICAgICAgICAgIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBSRVRGSUUgCgoKOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0taW5pdGlhbGlzYXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjttYWluIGNvZGUgc3RhcnRzIGhlcmUKOyAgICAgICAgICAgICAgb3JnICAgICAgICAgMHg5YQpzdGFydGhlcmUKICAgICAgICAgICAgICAgQkNGICAgICAgIElOVENPTiwgICAgICAgICAgICBHSUUgICAgICAgIAogICAgICAgICAgICAgICBCU0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwICAgICAgIAogICAgICAgICAgICAgICBNT1ZMVyAweGY3CiAgICAgICAgICAgICAgIE1PVldGIFRSSVNCCiAgICAgICAgICAgICAgIE1PVkxXIDB4MTAKICAgICAgICAgICAgICAgTU9WV0YgVFJJU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO21ha2UgUE9SVEEsNCBpbnB1dAo7ICAgICAgICAgICAgICBCU0YgICAgICAgVFJJU0IsIDB4MAo7ICAgICAgICAgICAgICBCU0YgICAgICAgVFJJU0IsICAweDQgICAgICAgICAgICAgICAgICAgICAgIAo7ICAgICAgICAgICAgICBCU0YgICAgICAgVFJJU0IsICAweDUgICAgICAgICAgICAgICAgICAgICAgIAo7ICAgICAgICAgICAgICBCU0YgICAgICAgVFJJU0IsICAweDYgICAgICAgICAgICAgICAgICAgICAgIAo7ICAgICAgICAgICAgICBCU0YgICAgICAgVFJJU0IsICAweDcgICAgICAgIAogICAgICAgICAgICAgICBCQ0YgICAgICAgT1BUSU9OX1JFRywgIE5PVF9SQlBVCiAgICAgICAgICAgICAgIEJDRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCiAgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAweDIwCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBGU1IgICAgICAgCmluaXQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Y2xlYXIgUkFNIHBhZ2UgMAogICAgICAgICAgICAgICBDTFJGICAgICBJTkRGICAgICAKICAgICAgICAgICAgICAgSU5DRiAgICAgRlNSLCAgICAgIEYgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIEZTUiwgICAgICBXICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgU1VCTFcgMHg3ZgogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGluaXQxCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBDTFJGICAgICBQT1JUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7SW5pdGlhbGl6ZSBQT1JUQSBieQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO3NldHRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtvdXRwdXQgZGF0YSBsYXRjaGVzCiAgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7VHVybiBjb21wYXJhdG9ycyBvZmYgYW5kCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBDTUNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZW5hYmxlIHBpbnMgZm9yIEkvTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2Z1bmN0aW9ucwo7ICAgICAgICAgICAgICBCU0YgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgUlAwICAgICAgIAo7ICAgICAgICAgICAgICBNT1ZMVyAweDEwCjsgICAgICAgICAgICAgIE1PVldGIFRSSVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDttYWtlIFBPUlRBLDQgaW5wdXQKOyAgICAgICAgICAgICAgQlNGICAgICAgIFRSSVNCLCAgMCAgICAgICAgICAgIAo7ICAgICAgICAgICAgICBCQ0YgICAgICAgVFJJU0IsICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgCjsgICAgICAgICAgICAgIEJDRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCiAgICAgICAgICAgICAgIEJDRiAgICAgICBQT1JUQiwgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgIENMUkYgICAgIFBPUlRBICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBDQUxMICAgICB3YWl0MjAwCiAgICAgICAgICAgICAgIENBTEwgICAgIHdhaXQyMDAKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtpbml0aWFsaXNlIExDRAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgUE9SVEEgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIENBTEwgICAgIGxjZF9zdHJvYmUKICAgICAgICAgICAgICAgQ0FMTCAgICAgd2FpdDIwMAogICAgICAgICAgICAgICBDQUxMICAgICBsY2Rfc3Ryb2JlCiAgICAgICAgICAgICAgIENBTEwgICAgIHdhaXQxZDUKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX3N0cm9iZQogICAgICAgICAgICAgICBDQUxMICAgICB3YWl0MWQ1CiAgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAweDAyICAgICAKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIFBPUlRBICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBDQUxMICAgICBsY2Rfc3Ryb2JlCiAgICAgICAgICAgICAgIENBTEwgICAgIHdhaXQxZDUKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4MjgKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX2NudGwKICAgICAgICAgICAgICAgQ0FMTCAgICAgd2FpdDFkNQogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHgwYyAgICAgIAogICAgICAgICAgICAgICBDQUxMICAgICBsY2RfY250bAogICAgICAgICAgICAgICBDQUxMICAgICB3YWl0MWQ1CiAgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAweDA2ICAgICAKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX2NudGwKICAgICAgICAgICAgICAgQ0FMTCAgICAgd2FpdDFkNQoKCjsgZGlzcGxheSBzdGFydCBzY3JlZW4gZnJvbSB0YWJsZQpzdHJ0c2NybgogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHgwMSAgICAgCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBsY2RjbnQKc3RydHNjcm4xCiAgICAgICAgICAgICAgIENMUkYgICAgIGJhdWRjbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2NvcHkgdGFibGUgY29uc3RhbnQgdG8gTENEIGZyYW1lIGJ1ZmZlciBSQU0KICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4NGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ZnJvbSAweDUwfjB4NmYgdG8gZGlzcGxheSBzdGFydCBzY3JlZW4KICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIGJhdWRfbApzdHJ0c2NybjIKICAgICAgICAgICAgICAgSU5DRiAgICAgYmF1ZF9sLCBGICAgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgYmF1ZF9sLCBXICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIEZTUiAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIGJhdWRjbnQsICAgICAgICAgICAgVyAgICAgICAgICAgCiAgICAgICAgICAgICAgIENBTEwgICAgIHRhYmxlCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBJTkRGCiAgICAgICAgICAgICAgIElOQ0YgICAgIGJhdWRjbnQsICAgICAgICAgICAgRiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIGJhdWRjbnQsICAgICAgICAgICAgVyAgICAgICAgICAgCiAgICAgICAgICAgICAgIFNVQkxXIDB4MjAKICAgICAgICAgICAgICAgQlRGU0MgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIHN0cnRzY3JuMwogICAgICAgICAgICAgICBHT1RPICAgc3RydHNjcm4yCgpzdHJ0c2NybjMKICAgICAgICAgICAgICAgQ0FMTCAgICAgZmIybGNkCiAgICAgICAgICAgICAgIENBTEwgICAgIHdhaXQyMDAKICAgICAgICAgICAgICAgREVDRlNaICAgICAgICAgICAgICBsY2RjbnQsIEYgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIHN0cnRzY3JuMQoKO2F1dG8gYmF1ZCByb3V0aW5lCmJhdWQKOyAgICAgICAgICAgICAgR09UTyAgIGJhdWQxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyoqKnNraXAgYXV0byBiYXVkIC0tIG1hbnVhbCBzZWxlY3Rpb24KICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4MTkKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIGJhdWRjbnQKYmF1ZDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO3dhaXQgZm9yIHNvbWUgYWN0aXZpdHkgb24gdGhlIFJ4RCBsaW5lICgyNCBjeWNsZXMpCiAgICAgICAgICAgICAgIERFQ0ZTWiAgICAgICAgICAgICAgYmF1ZGNudCwgICAgICAgICAgICBGICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBiYXVkMSAgCiAgICAgICAgICAgICAgIEdPVE8gICBiYXVkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2FmdGVyIDI0IGN5Y2xlcyBzdGFydCBhY3R1YWwgbWVhc3VyZW1lbnQKCgpiYXVkMQogICAgICAgICAgICAgICBDTFJXRFQgICAgICAgICAgICAKYmF1ZDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO3dhaXQgdGlsbCBSeEQgaXMgbG93CiAgICAgICAgICAgICAgIEJURlNDICBQT1JUQiwgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgIEdPVE8gICBiYXVkMiAgCmJhdWQzCiAgICAgICAgICAgICAgIEJURlNTICAgUE9SVEIsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDt3YWl0IHRpbGwgUnhEIGlzIGhpZ2gKICAgICAgICAgICAgICAgR09UTyAgIGJhdWQzICAKICAgICAgICAgICAgICAgR09UTyAgIGJhdWQwICAKOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhZnRlciAyNCBzaWduYWwgdG9nZ2xlcyBvbiBSeEQgY29tZSBoZXJlLCBSeEQgaXMgaGlnaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYmF1ZDQKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4ZmYKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIGJhdWRfaAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgYmF1ZF9sCiAgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAweDE5CiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBiYXVkY250CmJhdWQ1CiAgICAgICAgICAgICAgIERFQ0ZTWiAgICAgICAgICAgICAgYmF1ZGNudCwgICAgICAgICAgICBGICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBiYXVkNgogICAgICAgICAgICAgICBHT1RPICAgYmF1ZDEwICAgICAgICAgICAgICAgCgpiYXVkNgogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHgyMAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgVDFDT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7cnVuIHRpbWVyIDEgYXQgMS80IEZjeWMKICAgICAgICAgICAgICAgQ0xSRiAgICAgVE1SMUwKICAgICAgICAgICAgICAgQ0xSRiAgICAgVE1SMUgKYmF1ZDcKICAgICAgICAgICAgICAgQlRGU0MgIFBPUlRCLCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7d2FpdCB0aWxsIFJ4RCBnb2VzIGxvdwogICAgICAgICAgICAgICBHT1RPICAgYmF1ZDcgIAogICAgICAgICAgICAgICBCU0YgICAgICAgVDFDT04sICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO3N0YXJ0IHRpbWVyMQpiYXVkOAogICAgICAgICAgICAgICBCVEZTUyAgIFBPUlRCLCAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgR09UTyAgIGJhdWQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDt3YWl0IHRpbGwgUnhEIGdvZXMgaGlnaAogICAgICAgICAgICAgICBCQ0YgICAgICAgVDFDT04sICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO3N0b3AgdGltZXIxCiAgICAgICAgICAgICAgIE1PVkYgICBUTVIxTCwgVwogICAgICAgICAgICAgICBTVUJXRiAgICAgICAgICAgICAgIGJhdWRfbCwgVwogICAgICAgICAgICAgICBNT1ZGICAgVE1SMUgsICAgICAgICAgICAgICBXCiAgICAgICAgICAgICAgIEJURlNTICAgU1RBVFVTLCAgICAgICAgICAgICAgQyAgICAgICAgICAgIAogICAgICAgICAgICAgICBJTkNGICAgICBUTVIxSCwgICAgICAgICAgICAgIFcKICAgICAgICAgICAgICAgU1VCV0YgICAgICAgICAgICAgICBiYXVkX2gsICAgICAgICAgICAgICBXICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQlRGU1MgICBTVEFUVVMsICAgICAgICAgICAgICBDICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBiYXVkOSAgCiAgICAgICAgICAgICAgIE1PVkYgICBUTVIxTCwgVwogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgYmF1ZF9sCiAgICAgICAgICAgICAgIE1PVkYgICBUTVIxSCwgICAgICAgICAgICAgIFcKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIGJhdWRfaApiYXVkOQogICAgICAgICAgICAgICBHT1RPICAgYmF1ZDUKCmJhdWQxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7YmF1ZCByYXRlIGlzIGV2YWx1YXRlZAogICAgICAgICAgICAgICBNT1ZGICAgYmF1ZF9sLCBXCiAgICAgICAgICAgICAgIEJTRiAgICAgICBTVEFUVVMsICAgICAgICAgICAgICBSUDAgICAgICAgCjsgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAxMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7KioqIHRlc3QgMjQwMCBCYXVkIG1hbnVhbGx5ICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIFNQQlJHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO3dyaXRlIGJhdWQgcmF0ZSByZWdpc3RlcgogICAgICAgICAgICAgICBCU0YgICAgICAgVFhTVEEsIFRYRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2NvbmZpZ3VyZSBzZXJpYWwgcG9ydAogICAgICAgICAgICAgICBCU0YgICAgICAgVFhTVEEsIEJSR0ggICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQlNGICAgICAgIFRSSVNCLCAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBCU0YgICAgICAgVFJJU0IsICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEJDRiAgICAgICBQSUUxLCAgICAgVFhJRQogICAgICAgICAgICAgICBCU0YgICAgICAgUElFMSwgICAgIFJDSUUKICAgICAgICAgICAgICAgQkNGICAgICAgIFNUQVRVUywgICAgICAgICAgICAgIFJQMCAgICAgICAKICAgICAgICAgICAgICAgQlNGICAgICAgIFJDU1RBLCBTUEVOICAgIAogICAgICAgICAgICAgICBCU0YgICAgICAgUkNTVEEsIENSRU4gICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQlNGICAgICAgIElOVENPTiwgICAgICAgICAgICBQRUlFICAgICAgICAgICAgICAgICAgICAgO2VuYWJsZSBpbnRlcnJ1cHRzCiAgICAgICAgICAgICAgIEJTRiAgICAgICBJTlRDT04sICAgICAgICAgICAgR0lFICAgICAgICAKCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWZyb20gaGVyZSBpbnRlcnJ1cHRzIGFyZSBhY3RpdmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KO2hlcmUgd2UgZ28KCnJ4bGNkMQogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHgyMgogICAgICAgICAgICAgICBTVUJXRiAgICAgICAgICAgICAgIHJ4Y250LCAgICBXCiAgICAgICAgICAgICAgIEJURlNTICAgICAgICAgICAgICAgICAgU1RBVFVTLCAgICAgICAgICAgICAgWiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgICAgICAgICAgICAgICAgcnhsY2QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7d2FpdCB1bnRpbCAzNCBieXRlcyBvZiBkYXRhIGhhdmUgYmVlbiByZWNlaXZlZAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHgxZgogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgbGNkY250CnJ4bGNkMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Y29weSBkaXNwbGF5YWJsZSBwYXJ0IG9mIHJlY2VpdmVkIGRhdGEgdG8gZnJhbWUgYnVmZmVyIFJBTQogICAgICAgICAgICAgICBJTkNGICAgICBsY2RjbnQsIEYgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIE1PVkYgICBsY2RjbnQsIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgRlNSICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgSU5ERiwgICAgVyAgICAgICAgICAgCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBiYXVkX2gKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4MzAKICAgICAgICAgICAgICAgQUREV0YgICAgICAgICAgICAgICBGU1IsICAgICAgRiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIGJhdWRfaCwgICAgICAgICAgICAgIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgSU5ERgogICAgICAgICAgICAgICBNT1ZGICAgbGNkY250LCBXICAgICAgICAgICAKICAgICAgICAgICAgICAgU1VCTFcgMHgzZgogICAgICAgICAgICAgICBCVEZTUyAgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIHJ4bGNkMgogICAgICAgICAgICAgICBDQUxMICAgICBmYjJsY2QKICAgICAgICAgICAgICAgR09UTyAgIHJ4bGNkMQoKCjtzdWJyb3V0aW5lcyBzdGFydCBoZXJlCgoKO2RlbGF5IGJ5IDIwMG1zCndhaXQyMDAKICAgICAgICAgICAgICAgTU9WTFcgICAgICAgICAgICAgIDB4ZmYKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIGRlbGF5X2gKICAgICAgICAgICAgICAgQ0xSRiAgICAgZGVsYXlfbCAKd2FpdDIwMDEKICAgICAgICAgICAgICAgREVDRlNaICAgICAgICAgICAgICBkZWxheV9sLCAgICAgICAgICAgICAgIEYgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIHdhaXQyMDAxCiAgICAgICAgICAgICAgIERFQ0ZTWiAgICAgICAgICAgICAgZGVsYXlfaCwgICAgICAgICAgICAgRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgd2FpdDIwMDEKICAgICAgICAgICAgICAgUkVUVVJOICAgICAgICAgICAgIAoKCjtkZWxheSBieSAxLjVtcwp3YWl0MWQ1CiAgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAweDIgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgZGVsYXlfaAogICAgICAgICAgICAgICBDTFJGICAgICBkZWxheV9sIAp3YWl0MWQ1MQogICAgICAgICAgICAgICBERUNGU1ogICAgICAgICAgICAgIGRlbGF5X2wsICAgICAgICAgICAgICAgRiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBHT1RPICAgd2FpdDFkNTEKICAgICAgICAgICAgICAgREVDRlNaICAgICAgICAgICAgICBkZWxheV9oLCAgICAgICAgICAgICBGICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICB3YWl0MWQ1MQogICAgICAgICAgICAgICBSRVRVUk4gICAgICAgICAgICAgCgo7Y29weSBmcmFtZSBidWZmZXIgY29udGVudHMgdG8gTENECmZiMmxjZAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHg4MAogICAgICAgICAgICAgICBDQUxMICAgICBsY2RfY250bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO21vdmUgY3Vyc29yIHRvIGFkZHJlc3MgMAogICAgICAgICAgICAgICBDTFJGICAgICBiYXVkY250ICAgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHg0ZgogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgYmF1ZF9sCmZiMmxjZDEKICAgICAgICAgICAgICAgSU5DRiAgICAgYmF1ZF9sLCBGICAgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgYmF1ZF9sLCBXICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WV0YgICAgICAgICAgICAgIEZTUiAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIElOREYsICAgIFcKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX3dyaXRlCiAgICAgICAgICAgICAgIElOQ0YgICAgIGJhdWRjbnQsICAgICAgICAgICAgRiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIGJhdWRjbnQsICAgICAgICAgICAgVyAgICAgICAgICAgCiAgICAgICAgICAgICAgIFNVQkxXIDB4MTAKICAgICAgICAgICAgICAgQlRGU0MgIFNUQVRVUywgICAgICAgICAgICAgIFogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgR09UTyAgIGZiMmxjZDIKICAgICAgICAgICAgICAgR09UTyAgIGZiMmxjZDEKZmIybGNkMgogICAgICAgICAgICAgICBNT1ZMVyAgICAgICAgICAgICAgMHhjMCAgICAgICAgICAgICAgICAgICAgOyoqKkxDRCBzZWNvbmQgbGluZQo7d2FzIE1PVkxXICAgIDB4YTgKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX2NudGwKZmIybGNkMwogICAgICAgICAgICAgICBJTkNGICAgICBiYXVkX2wsIEYgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIE1PVkYgICBiYXVkX2wsIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgRlNSICAgICAgIAogICAgICAgICAgICAgICBNT1ZGICAgSU5ERiwgICAgVyAgICAgICAgICAgCiAgICAgICAgICAgICAgIENBTEwgICAgIGxjZF93cml0ZQogICAgICAgICAgICAgICBJTkNGICAgICBiYXVkY250LCAgICAgICAgICAgIEYgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIE1PVkYgICBiYXVkY250LCAgICAgICAgICAgIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBTVUJMVyAweDIwCiAgICAgICAgICAgICAgIEJURlNDICBTVEFUVVMsICAgICAgICAgICAgICBaICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIEdPVE8gICBmYjJsY2Q0CiAgICAgICAgICAgICAgIEdPVE8gICBmYjJsY2QzCmZiMmxjZDQKICAgICAgICAgICAgICAgUkVUVVJOICAgICAgICAgICAgIAoKCjtzZW5kIGVuYWJsZSB0byBMQ0QgKEUpCmxjZF9zdHJvYmUKICAgICAgICAgICAgICAgQlNGICAgICAgIFBPUlRBLCA3ICAgICAgICAgICAgCiAgICAgICAgICAgICAgIE5PUCAgICAgIAogICAgICAgICAgICAgICBOT1AgICAgICAKICAgICAgICAgICAgICAgTk9QICAgICAgCiAgICAgICAgICAgICAgIEJDRiAgICAgICBQT1JUQSwgNyAgICAgICAgICAgIAogICAgICAgICAgICAgICBSRVRVUk4gICAgICAgICAgICAgCgo7c2VuZCBjb250cm9sIGJ5dGUgdG8gTENECmxjZF9jbnRsCiAgICAgICAgICAgICAgIEJDRiAgICAgICBQT1JUQiwzCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBkZWxheV9sCiAgICAgICAgICAgICAgIFNXQVBGIGRlbGF5X2wsICAgICAgICAgICAgICAgVwogICAgICAgICAgICAgICBBTkRMVyAgICAgICAgICAgICAgIDB4MGYgICAgICAgCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBQT1JUQSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX3N0cm9iZQogICAgICAgICAgICAgICBNT1ZGICAgZGVsYXlfbCwgICAgICAgICAgICAgICBXICAgICAgICAgICAKICAgICAgICAgICAgICAgQU5ETFcgICAgICAgICAgICAgICAweDBmICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgUE9SVEEgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIENBTEwgICAgIGxjZF9zdHJvYmUKICAgICAgICAgICAgICAgQ0FMTCAgICAgd2FpdDFkNQogICAgICAgICAgICAgICBDQUxMICAgICB3YWl0MWQ1CiAgICAgICAgICAgICAgIENBTEwgICAgIHdhaXQxZDUKICAgICAgICAgICAgICAgUkVUVVJOICAgICAgICAgICAgIAoKCjtzZW5kIGRpc3BsYXlhYmxlIGRhdGEgYnl0ZSB0byBMQ0QKbGNkX3dyaXRlCjstLS0tLS0tLSBjaGFyYWN0ZXIgcmVtYXBwaW5nIGZvciAiICIgYW5kICIgIiBmb3IgUG93ZXJUaXAgTENEICAtLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgTU9WV0YgcmVtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDt0ZW1wb3JhcmlseSBzdG9yZSB2YWx1ZQogICAgICAgICAgICAgICBTVUJMVyAweGRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Y2hlY2sgZm9yICIgIiBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgQlRGU1MgICBTVEFUVVMsWgogICAgICAgICAgICAgICBHT1RPICAgcmVtYXAxCiAgICAgICAgICAgICAgIE1PVkxXIDB4ZDIKICAgICAgICAgICAgICAgR09UTyAgIHJlbWFwMwpyZW1hcDEKICAgICAgICAgICAgICAgTU9WRiAgIHJlbWFwLFcKICAgICAgICAgICAgICAgU1VCTFcgMHhlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Y2hlY2sgZm9yICIgIiBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgQlRGU1MgICBTVEFUVVMsWgogICAgICAgICAgICAgICBHT1RPICAgcmVtYXAyCiAgICAgICAgICAgICAgIE1PVkxXIDB4YzgKICAgICAgICAgICAgICAgR09UTyAgIHJlbWFwMwpyZW1hcDIKICAgICAgICAgICAgICAgTU9WRiAgIHJlbWFwLFcKcmVtYXAzICAgICAgICAgICAgICAgCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2hhcmFjdGVyIHJlbWFwcGluZyBmaW5pc2hlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICBCU0YgICAgICAgUE9SVEIsICAgICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgZGVsYXlfbAogICAgICAgICAgICAgICBTV0FQRiBkZWxheV9sLCAgICAgICAgICAgICAgIFcKICAgICAgICAgICAgICAgQU5ETFcgICAgICAgICAgICAgICAweDBmCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBQT1JUQSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX3N0cm9iZQogICAgICAgICAgICAgICBNT1ZGICAgZGVsYXlfbCwgICAgICAgICAgICAgICBXICAgICAgICAgICAKICAgICAgICAgICAgICAgQU5ETFcgICAgICAgICAgICAgICAweDBmCiAgICAgICAgICAgICAgIE1PVldGICAgICAgICAgICAgICBQT1JUQSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgQ0FMTCAgICAgbGNkX3N0cm9iZQogICAgICAgICAgICAgICBDQUxMICAgICB3YWl0MWQ1CiAgICAgICAgICAgICAgIEJDRiAgICAgICBQT1JUQiwgMyAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIFJFVFVSTiAgICAgICAgICAgICAKCgo7c3RhcnQgc2NyZWVuIGxvb2t1cCB0YWJsZQogICAgICAgICAgICAgICBvcmcgICAgICAgICAweDMwMAp0YWJsZQogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgYmF1ZF9oCiAgICAgICAgICAgICAgIE1PVkxXICAgICAgICAgICAgICAweDMgICAgICAgIAogICAgICAgICAgICAgICBNT1ZXRiAgICAgICAgICAgICAgUENMQVRIICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgTU9WRiAgIGJhdWRfaCwgICAgICAgICAgICAgIFcgICAgICAgICAgIAogICAgICAgICAgICAgICBBRERXRiAgICAgICAgICAgICAgIFBDTCwgICAgICBGICAgICAgICAgICAgIAogICAgICAgICAgICAgICBSRVRMVyAweDU0ICAgICAgICAgICAgICAgICAgICA7VAogICAgICAgICAgICAgICBSRVRMVyAweDY1ICAgICAgICAgICAgICAgICAgICA7ZQogICAgICAgICAgICAgICBSRVRMVyAweDcyICAgICAgICAgICAgICAgICAgICA7cgogICAgICAgICAgICAgICBSRVRMVyAweDZkICAgICAgICAgICAgICAgICAgICA7bQogICAgICAgICAgICAgICBSRVRMVyAweDY5ICAgICAgICAgICAgICAgICAgICA7aQogICAgICAgICAgICAgICBSRVRMVyAweDZlICAgICAgICAgICAgICAgICAgICA7bgogICAgICAgICAgICAgICBSRVRMVyAweDYxICAgICAgICAgICAgICAgICAgICA7YQogICAgICAgICAgICAgICBSRVRMVyAweDZjICAgICAgICAgICAgICAgICAgICA7bAogICAgICAgICAgICAgICBSRVRMVyAweDIwICAgICAgICAgICAgICAgICAgICA7XwogICAgICAgICAgICAgICBSRVRMVyAweDU2ICAgICAgICAgICAgICAgICAgICA7VgogICAgICAgICAgICAgICBSRVRMVyAweDIwICAgICAgICAgICAgICAgICAgICA7XwogICAgICAgICAgICAgICBSRVRMVyAweDMxICAgICAgICAgICAgICAgICAgICA7MQogICAgICAgICAgICAgICBSRVRMVyAweDJlICAgICAgICAgICAgICAgICAgICA7LgogICAgICAgICAgICAgICBSRVRMVyAweDMxICAgICAgICAgICAgICAgICAgICA7MQogICAgICAgICAgICAgICBSRVRMVyAweDIwICAgICAgICAgICAgICAgICAgICA7XwogICAgICAgICAgICAgICBSRVRMVyAweDIwICAgICAgICAgICAgICAgICAgICA7XwogICAgICAgICAgICAgICBSRVRMVyAweDQzICAgICAgICAgICAgICAgICAgICA7QwogICAgICAgICAgICAgICBSRVRMVyAweDZmICAgICAgICAgICAgICAgICAgICAgO28KICAgICAgICAgICAgICAgUkVUTFcgMHg2ZSAgICAgICAgICAgICAgICAgICAgO24KICAgICAgICAgICAgICAgUkVUTFcgMHg2ZSAgICAgICAgICAgICAgICAgICAgO24KICAgICAgICAgICAgICAgUkVUTFcgMHg2NSAgICAgICAgICAgICAgICAgICAgO2UKICAgICAgICAgICAgICAgUkVUTFcgMHg2MyAgICAgICAgICAgICAgICAgICAgO2MKICAgICAgICAgICAgICAgUkVUTFcgMHg3NCAgICAgICAgICAgICAgICAgICAgO3QKICAgICAgICAgICAgICAgUkVUTFcgMHg2OSAgICAgICAgICAgICAgICAgICAgO2kKICAgICAgICAgICAgICAgUkVUTFcgMHg2ZSAgICAgICAgICAgICAgICAgICAgO24KICAgICAgICAgICAgICAgUkVUTFcgMHg2NyAgICAgICAgICAgICAgICAgICAgO2cKICAgICAgICAgICAgICAgUkVUTFcgMHgyZSAgICAgICAgICAgICAgICAgICAgOy4KICAgICAgICAgICAgICAgUkVUTFcgMHgyZSAgICAgICAgICAgICAgICAgICAgOy4KICAgICAgICAgICAgICAgUkVUTFcgMHgyZSAgICAgICAgICAgICAgICAgICAgOy4KICAgICAgICAgICAgICAgUkVUTFcgMHgyMCAgICAgICAgICAgICAgICAgICAgO18KICAgICAgICAgICAgICAgUkVUTFcgMHgyMCAgICAgICAgICAgICAgICAgICAgO18KICAgICAgICAgICAgICAgUkVUTFcgMHgyMCAgICAgICAgICAgICAgICAgICAgO18KCgogICAgICAgICAgICAgICBlbmQK
;Hand Data Terminal for FADEC
list p = 16f627a
include "P16f627a.inc"
__CONFIG 0x1f14
lcdbuf equ 0x20 ;0x20...0x3f 32bytes for LCD buffer
;-----------------------------global registers starting at 0x70------------------------------
rxbuf equ 0x70 ;serial reception buffer
debounce equ 0x71 ;debounce counter for keys
txbuf equ 0x72 ;transmit buffer holds code to be sent when key pressed
txcnt equ 0x73 ;transmitted byte counter
W_temp equ 0x74
STA_temp equ 0x75
FSR_temp equ 0x76
rxcnt equ 0x77 ;received byte counter
delay_h equ 0x78
delay_l equ 0x79
lcdcnt equ 0x7a
baud_h equ 0x7b
baud_l equ 0x7c
baudcnt equ 0x7d
remap equ 0x7e ;temporary register for remapping characters
org 0
GOTO starthere
org 0x04
isr0
BTFSS STATUS, RP0
GOTO isr1
BCF STATUS, RP0
MOVWF W_temp
BSF STATUS, RP0
MOVF STATUS, W
BCF STATUS, RP0
GOTO isr2
isr1
MOVWF W_temp
MOVF STATUS, W
isr2
MOVWF STA_temp
MOVF FSR, W
MOVWF FSR_temp
BCF STATUS, RP0
BTFSS INTCON, RBIF
GOTO isr7
BSF STATUS, RP0
BSF TRISB, 0x04
BSF TRISB, 0x05
BSF TRISB, 0x06
BSF TRISB, 0x07
BCF OPTION_REG, NOT_RBPU
BCF STATUS, RP0
MOVF PORTB, W
BCF INTCON, RBIF
COMF PORTB, W
ANDLW 0xf0
BTFSC STATUS, Z
GOTO isr6
MOVLW 0x04
MOVWF debounce
;check for pressed keys
BTFSC PORTB, 0x07
GOTO isr3
MOVLW 0x41 ;DATA + pressed, send 0x41
MOVWF txbuf
GOTO isr5
isr3
BTFSC PORTB, 0x06
GOTO isr4
MOVLW 0x42 ;DATA - pressed, send 0x42
MOVWF txbuf
GOTO isr5
isr4
BTFSS PORTB, 0x05
MOVLW 0x44 ;MENU - pressed, send 0x44
BTFSS PORTB, 0x04
MOVLW 0x43 ;MENU + pressed, send 0x43
isr5
MOVWF txbuf
CLRF txcnt
MOVLW 0xde ;
MOVWF TXREG
BSF STATUS, RP0 ;enable serial transmit interrupt
BSF PIE1, TXIE
BCF STATUS, RP0
isr6
BCF INTCON, RBIF
;Serial communication interrupt
isr7
BTFSS PIR1, RCIF
GOTO isr13
CLRWDT
MOVF RCREG, W
MOVWF rxbuf ;store received byte in rxbuf
MOVF rxcnt, W
BTFSS STATUS, Z
GOTO isr8
MOVF rxbuf, W ;check for first data block alignment byte
SUBLW 0xfc
BTFSS STATUS, Z
GOTO isr12
INCF rxcnt, F
GOTO isr12
isr8
DECF rxcnt, W
BTFSS STATUS, Z
GOTO isr9
MOVF rxbuf, W ;check for second data block alignment byte
SUBLW 0xfd
BTFSS STATUS, Z
GOTO isr11
INCF rxcnt, F
GOTO isr12
isr9
MOVF rxcnt, W ;store receiverd serial data to RAM starting at 0x20
ADDLW (lcdbuf - 2) ;(0x1e + 2)
MOVWF FSR
MOVF rxbuf, W
MOVWF INDF
INCF rxcnt, F
MOVLW 0x32
SUBWF rxcnt, W
BTFSS STATUS, Z
GOTO isr12
CLRF rxcnt
MOVLW 0x4
SUBWF txcnt, W
BTFSS STATUS, Z
GOTO isr12
BTFSS PORTB, 0x6
GOTO isr10
BTFSC PORTB, 0x7
GOTO isr12
isr10
DECFSZ debounce, F
GOTO isr12
INCF debounce, F
CLRF txcnt
MOVLW 0xde
MOVWF TXREG
BSF STATUS, RP0
BSF PIE1, TXIE
BCF STATUS, RP0
GOTO isr12
isr11
CLRF rxcnt
isr12
BCF PIR1, RCIF
isr13
BTFSS PIR1, TXIF
GOTO isr18
BSF STATUS, RP0
BTFSS PIE1, TXIE
GOTO isr18
BCF STATUS, RP0
MOVF txcnt, W
BTFSS STATUS, Z
GOTO isr14
MOVLW 0xdf
MOVWF TXREG
INCF txcnt, F
GOTO isr17
isr14
DECF txcnt, W
BTFSS STATUS, Z
GOTO isr15
MOVLW 0x70
MOVWF TXREG
INCF txcnt, F
GOTO isr17
isr15
MOVLW 0x2
SUBWF txcnt, W
BTFSS STATUS, Z
GOTO isr16
MOVF txbuf, W
MOVWF TXREG
INCF txcnt, F
GOTO isr17
isr16
MOVLW 0x70
ADDWF txbuf, W
MOVWF TXREG
INCF txcnt, F
BSF STATUS, RP0
BCF PIE1, TXIE
BCF STATUS, RP0
isr17
BCF PIR1, TXIF
isr18
BCF STATUS, RP0
MOVF FSR_temp, W
MOVWF FSR
MOVF STA_temp, W
MOVWF STATUS
MOVF W_temp, W
RETFIE
;--------------------------------------initialisation-------------------------------------------
;main code starts here
; org 0x9a
starthere
BCF INTCON, GIE
BSF STATUS, RP0
MOVLW 0xf7
MOVWF TRISB
MOVLW 0x10
MOVWF TRISA ;make PORTA,4 input
; BSF TRISB, 0x0
; BSF TRISB, 0x4
; BSF TRISB, 0x5
; BSF TRISB, 0x6
; BSF TRISB, 0x7
BCF OPTION_REG, NOT_RBPU
BCF STATUS, RP0
MOVLW 0x20
MOVWF FSR
init1 ;clear RAM page 0
CLRF INDF
INCF FSR, F
MOVF FSR, W
SUBLW 0x7f
BTFSS STATUS, Z
GOTO init1
CLRF PORTA ;Initialize PORTA by
;setting
;output data latches
MOVLW 0x07 ;Turn comparators off and
MOVWF CMCON ;enable pins for I/O
;functions
; BSF STATUS, RP0
; MOVLW 0x10
; MOVWF TRISA ;make PORTA,4 input
; BSF TRISB, 0
; BCF TRISB, 3
; BCF STATUS, RP0
BCF PORTB, 3
CLRF PORTA
CALL wait200
CALL wait200
MOVLW 0x03 ;initialise LCD
MOVWF PORTA
CALL lcd_strobe
CALL wait200
CALL lcd_strobe
CALL wait1d5
CALL lcd_strobe
CALL wait1d5
MOVLW 0x02
MOVWF PORTA
CALL lcd_strobe
CALL wait1d5
MOVLW 0x28
CALL lcd_cntl
CALL wait1d5
MOVLW 0x0c
CALL lcd_cntl
CALL wait1d5
MOVLW 0x06
CALL lcd_cntl
CALL wait1d5
; display start screen from table
strtscrn
MOVLW 0x01
MOVWF lcdcnt
strtscrn1
CLRF baudcnt ;copy table constant to LCD frame buffer RAM
MOVLW 0x4f ;from 0x50~0x6f to display start screen
MOVWF baud_l
strtscrn2
INCF baud_l, F
MOVF baud_l, W
MOVWF FSR
MOVF baudcnt, W
CALL table
MOVWF INDF
INCF baudcnt, F
MOVF baudcnt, W
SUBLW 0x20
BTFSC STATUS, Z
GOTO strtscrn3
GOTO strtscrn2
strtscrn3
CALL fb2lcd
CALL wait200
DECFSZ lcdcnt, F
GOTO strtscrn1
;auto baud routine
baud
; GOTO baud10 ;***skip auto baud -- manual selection
MOVLW 0x19
MOVWF baudcnt
baud0 ;wait for some activity on the RxD line (24 cycles)
DECFSZ baudcnt, F
GOTO baud1
GOTO baud4 ;after 24 cycles start actual measurement
baud1
CLRWDT
baud2 ;wait till RxD is low
BTFSC PORTB, 0
GOTO baud2
baud3
BTFSS PORTB, 0 ;wait till RxD is high
GOTO baud3
GOTO baud0
;--------------------------- after 24 signal toggles on RxD come here, RxD is high ------------------------
baud4
MOVLW 0xff
MOVWF baud_h
MOVWF baud_l
MOVLW 0x19
MOVWF baudcnt
baud5
DECFSZ baudcnt, F
GOTO baud6
GOTO baud10
baud6
MOVLW 0x20
MOVWF T1CON ;run timer 1 at 1/4 Fcyc
CLRF TMR1L
CLRF TMR1H
baud7
BTFSC PORTB, 0 ;wait till RxD goes low
GOTO baud7
BSF T1CON, 0 ;start timer1
baud8
BTFSS PORTB, 0
GOTO baud8 ;wait till RxD goes high
BCF T1CON, 0 ;stop timer1
MOVF TMR1L, W
SUBWF baud_l, W
MOVF TMR1H, W
BTFSS STATUS, C
INCF TMR1H, W
SUBWF baud_h, W
BTFSS STATUS, C
GOTO baud9
MOVF TMR1L, W
MOVWF baud_l
MOVF TMR1H, W
MOVWF baud_h
baud9
GOTO baud5
baud10 ;baud rate is evaluated
MOVF baud_l, W
BSF STATUS, RP0
; MOVLW 103 ;*** test 2400 Baud manually
MOVWF SPBRG ;write baud rate register
BSF TXSTA, TXEN ;configure serial port
BSF TXSTA, BRGH
BSF TRISB, 1
BSF TRISB, 2
BCF PIE1, TXIE
BSF PIE1, RCIE
BCF STATUS, RP0
BSF RCSTA, SPEN
BSF RCSTA, CREN
BSF INTCON, PEIE ;enable interrupts
BSF INTCON, GIE
;-----------------------------from here interrupts are active---------------------------------
;here we go
rxlcd1
MOVLW 0x22
SUBWF rxcnt, W
BTFSS STATUS, Z
GOTO rxlcd1 ;wait until 34 bytes of data have been received
MOVLW 0x1f
MOVWF lcdcnt
rxlcd2 ;copy displayable part of received data to frame buffer RAM
INCF lcdcnt, F
MOVF lcdcnt, W
MOVWF FSR
MOVF INDF, W
MOVWF baud_h
MOVLW 0x30
ADDWF FSR, F
MOVF baud_h, W
MOVWF INDF
MOVF lcdcnt, W
SUBLW 0x3f
BTFSS STATUS, Z
GOTO rxlcd2
CALL fb2lcd
GOTO rxlcd1
;subroutines start here
;delay by 200ms
wait200
MOVLW 0xff
MOVWF delay_h
CLRF delay_l
wait2001
DECFSZ delay_l, F
GOTO wait2001
DECFSZ delay_h, F
GOTO wait2001
RETURN
;delay by 1.5ms
wait1d5
MOVLW 0x2
MOVWF delay_h
CLRF delay_l
wait1d51
DECFSZ delay_l, F
GOTO wait1d51
DECFSZ delay_h, F
GOTO wait1d51
RETURN
;copy frame buffer contents to LCD
fb2lcd
MOVLW 0x80
CALL lcd_cntl ;move cursor to address 0
CLRF baudcnt
MOVLW 0x4f
MOVWF baud_l
fb2lcd1
INCF baud_l, F
MOVF baud_l, W
MOVWF FSR
MOVF INDF, W
CALL lcd_write
INCF baudcnt, F
MOVF baudcnt, W
SUBLW 0x10
BTFSC STATUS, Z
GOTO fb2lcd2
GOTO fb2lcd1
fb2lcd2
MOVLW 0xc0 ;***LCD second line
;was MOVLW 0xa8
CALL lcd_cntl
fb2lcd3
INCF baud_l, F
MOVF baud_l, W
MOVWF FSR
MOVF INDF, W
CALL lcd_write
INCF baudcnt, F
MOVF baudcnt, W
SUBLW 0x20
BTFSC STATUS, Z
GOTO fb2lcd4
GOTO fb2lcd3
fb2lcd4
RETURN
;send enable to LCD (E)
lcd_strobe
BSF PORTA, 7
NOP
NOP
NOP
BCF PORTA, 7
RETURN
;send control byte to LCD
lcd_cntl
BCF PORTB,3
MOVWF delay_l
SWAPF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
MOVF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
CALL wait1d5
CALL wait1d5
CALL wait1d5
RETURN
;send displayable data byte to LCD
lcd_write
;-------- character remapping for " " and " " for PowerTip LCD ---------------
MOVWF remap ;temporarily store value
SUBLW 0xdf ;check for " " character
BTFSS STATUS,Z
GOTO remap1
MOVLW 0xd2
GOTO remap3
remap1
MOVF remap,W
SUBLW 0xe4 ;check for " " character
BTFSS STATUS,Z
GOTO remap2
MOVLW 0xc8
GOTO remap3
remap2
MOVF remap,W
remap3
;--------------------------- character remapping finished -----------------------------
BSF PORTB, 3
MOVWF delay_l
SWAPF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
MOVF delay_l, W
ANDLW 0x0f
MOVWF PORTA
CALL lcd_strobe
CALL wait1d5
BCF PORTB, 3
RETURN
;start screen lookup table
org 0x300
table
MOVWF baud_h
MOVLW 0x3
MOVWF PCLATH
MOVF baud_h, W
ADDWF PCL, F
RETLW 0x54 ;T
RETLW 0x65 ;e
RETLW 0x72 ;r
RETLW 0x6d ;m
RETLW 0x69 ;i
RETLW 0x6e ;n
RETLW 0x61 ;a
RETLW 0x6c ;l
RETLW 0x20 ;_
RETLW 0x56 ;V
RETLW 0x20 ;_
RETLW 0x31 ;1
RETLW 0x2e ;.
RETLW 0x31 ;1
RETLW 0x20 ;_
RETLW 0x20 ;_
RETLW 0x43 ;C
RETLW 0x6f ;o
RETLW 0x6e ;n
RETLW 0x6e ;n
RETLW 0x65 ;e
RETLW 0x63 ;c
RETLW 0x74 ;t
RETLW 0x69 ;i
RETLW 0x6e ;n
RETLW 0x67 ;g
RETLW 0x2e ;.
RETLW 0x2e ;.
RETLW 0x2e ;.
RETLW 0x20 ;_
RETLW 0x20 ;_
RETLW 0x20 ;_
end