;Forfatter : Navn
;Projekt : Navn
; Dato : xx
/*
d: 15/1-2010, ændret så der kan skrives æøå, ÆØÅ i tekststring'en.
Denne rutine er beregnet til at kopiere ind i et uC projekt, for at opnå kontakt til
et LCD Karakterdisplay
Der downloades danske karakterer æ, ø, å, og Æ, Ø og Å i LCD-modulet !
Startet d. 21/9-03 rev 250903, 2/12-06, 22/01-2007
This text is used for copying into a uC project, in order to comunicate with a
LCD Character module.
The danish special characters are downloaded in the LCD
Valle Thorø
*/
;$nomod51 ;se bort fra 8051 reegistre
;$include (at892051.inc) ;Benyt istedet ATMEL89C2051 definitioner
;*********************************************************************************************
NAME LCDDisplay
;*********************************************************************************************
; Konstant-, Hukommelses- og Portbelægning
; Constants, memory and Pins definitions
;---------------------------------------------------------------
; Pins-definitioner
LCD_RS EQU P1.7
LCD_RW EQU P1.6
LCD_ENABLE EQU P1.5
LCD_D4 EQU P1.4
LCD_D5 EQU P1.3
LCD_D6 EQU P1.2
LCD_D7 EQU P1.1
; LCD_ENABLE kan undværes, Så skal LCD'en blot være enablet hele tiden
; Aktiv LAV !
; LCD_ENABLE is not nessassary needed, should then by hardware be connected to low.
;-------------------------
; RAMdefinitioner / Ram-definitions
; definition af konstanter / definition of Constants
;------------------------------------------
; Her starter selve programmet
; Here the program starts
Org 0h ; Programmer assembleres til at starte i adresse 0,
; der er adressen, der startes i ved reset !
jmp start
;Her er gjort plads til interruptvektorer. De, der skal bruges, skal Unmarkes.
; ORG 03h ; Interrupt from extern interrupt 0
; jmp EX0int
; ORG 0Bh ; Interrupt from Counter 0 overflow
; Jmp Timer0int ; Hop til timerrutine / Jump to subroutine
; ORG 13h ; Interrupt from Extern interrupt 1
; jmp EX1int
; ORG 1Bh ;Interrupt from timer 1
; jmp Timer ;Hop til timerrutine / Jump to subroutine
; org 023h ; seriel interrupt vektor, udløst af RI eller TI
; jmp serint ; Created by RI or TI
Start:
Org 30h ; her starter programmet
mov sp, #30h ; flyt / Move stackpointer, default = 07h
Call LCD_init ; Start LCD-displayet op, og upload danske karakterer.
;
; Programmet kan placeres her
Mit_program:
/*
Tekstbeskeder skrives fx. som følger:
Mov a, #00h ; 1. pos på linien, fra 0 til 19.
call PCL2 ; PCL1 = Linie 1, PCL2 = Linie 2,
mov dptr, #LCD_txt3 ; Datapointer points at text
call LCD_Printstring ; Write message, terminated with a 0 ( Zero )
;----------
*/
Loop: ; Stop programafvikling her.
Jmp Loop ; Jmp $ betyder også "hop til samme linie"
; Her kommer subrutiner::
;***************************************
; Subrutiner til LC-Display Styring
; Subroutines for controlling the LCD
;***************************************
LCD_init: ; LCD initialiering
mov a,#50
LCD_init_sleepsometime: ; Wait some time til displayet er initialiseret
call LCD_ws
djnz Acc,LCD_init_sleepsometime
; Send styrekoder, for at LCD in itialiseres ved power on
; send control codes for initiating
clr LCD_RS
clr LCD_RW
clr LCD_ENABLE
mov a,#00101000b
call LCD_send_b
setb LCD_ENABLE
clr LCD_ENABLE
mov a,#00101000b
call LCD_send_b
mov a,#1110b ;Cursor on !
call LCD_send_b
call LCD_clear
;
mov a,#64
call LCD_send_b
; Send danske karakterer til LCD
mov DPTR,#LCD_cgram
mov R0,#64
LCD_cgram_label:
clr a
movc a,@A+DPTR
inc DPTR
call LCD_send_d
djnz R0,LCD_cgram_label
call LCD_returnhome
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_returnhome: ; Kaldes for at flytte cursor til linie 1, 1. pos.
push ACC ; Position the cursor line 1 position 1
mov a,#128
call LCD_send_b
pop ACC
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_clear: ; Sletter al tekst, & Curser Home !
push ACC ; clear display
mov a,#1
call LCD_send_b
pop ACC
call Delay
Ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Delay: mov R5, #15 ; short delay
Delay1: mov R6, #25
djnz R6, $
djnz R5, Delay1
Ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
curser_on:
mov a,#1110b ;Cursor on !
call LCD_send_b
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
curser_off:
mov a,#1100b ;Cursor off !
call LCD_send_b
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_printc: ; Sender en karakter i ACC
; send character in ACC
call LCD_send_d
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_printstring: ; Skriver en String, der termineres med et 0, Bruger datapointeren DPTR
; Writes a string, terminated with "0". Uses the Data Pointer
push ACC
LCD_prints_anf:
clr a
movc a,@A+DPTR
jz LCD_prints_weiter
; tjek for danske karakterer
Call Tjek_DK
; Print
call LCD_printc
inc DPTR
jmp LCD_prints_anf
LCD_prints_weiter:
pop ACC
ret
;--------------------------
Tjek_DK: ; her tjekkes og korrigeres for danske karakterer
; Data er i reg A.
cjne a, #'æ', Tjek_DK1
mov a, #01h
jmp Tjek_DK99 ; til bund af subrutine
Tjek_DK1:
cjne a, #'ø', Tjek_DK2
mov a, #02h
jmp Tjek_DK99 ; til bund af subrutine
Tjek_DK2:
cjne a, #'å', Tjek_DK3
mov a, #03h
jmp Tjek_DK99 ; til bund af subrutine
Tjek_DK3:
cjne a, #'Æ', Tjek_DK4
mov a, #04h
jmp Tjek_DK99 ; til bund af subrutine
Tjek_DK4:
cjne a, #'Ø', Tjek_DK5
mov a, #05h
jmp Tjek_DK99 ; til bund af subrutine
Tjek_DK5:
cjne a, #'Å', Tjek_DK6
mov a, #06h
Tjek_DK6:
Tjek_DK99:
Ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LCD_send_b: ; sender styrekode i ACC til LCD, Til at indstille displayet !
; Send Commands in ACC, to control the LCD
clr LCD_RS
clr LCD_RW
jmp LCD_send
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;sender Data i Acc til LCD, Sender "ASCII". Det er dog således i
; realiteten, at der sendes en talværdi, på den adresse i LCD'ens
;ROM, hvori et mønster på et bogstav er gemt.
; De nederste 8 er udlagt i RAM, og det er heri, der kan downloades
; nationale karakterer.
LCD_send_d:
clr LCD_RW
setb LCD_RS
LCD_send:
mov c,ACC.7 ; high-nibble sendes
mov LCD_D7,c
mov c,ACC.6
mov LCD_D6,c
mov c,ACC.5
mov LCD_D5,c
mov c,ACC.4
mov LCD_D4,c
;
setb LCD_ENABLE
call LCD_ws
clr LCD_ENABLE
;
mov c,ACC.3 ; low-nibble sendes
mov LCD_D7,c
mov c,ACC.2
mov LCD_D6,c
mov c,ACC.1
mov LCD_D5,c
mov c,ACC.0
mov LCD_D4,c
;
setb LCD_ENABLE
call LCD_ws
clr LCD_ENABLE
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; 1.64ms ventesløjfe / Wait 1.64 ms
; Antal maskincykler: 1640
LCD_ws:
push psw
push 0
mov 0,#232
LCD_ws_labelA:
nop
nop
nop
nop
nop
djnz 0,LCD_ws_labelA
nop
nop
pop 0
pop psw
ret
;------------------------------------------------------
; Subroutiner til at positionere cursoren:
; det, der står i displayet slettes ikke
; Subroutines for positioning the Cursor
; Content in A will move the cursor to that position on the line ( 0 - 19 d )
;Subroutine til positionering af linie 1, 2, 3 eller 4. i LCD-display
;Input: Indhold i Acc er X-værdi på linien ( 0 til 19 d ) !!
;
PCL1: jmp PCL_99 ; Linie 1
PCL2: add a, #40h ; Linie 2
jmp PCL_99
PCL3: add a, #14h ; Linie 3
jmp PCL_99
PCL4: add a, #54h ; Linie 4
PCL_99: add a, #80h
call lcd_send_b
ret
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Eksempler på Tekstbeskeder, Max 20 karakterer pr linie
; De afsluttes med et '0'
; Examples of textmessages. Max 20 Char. pr. line
; Lines are terminated by "0"
; LCD_txt1: db 'HTX S', 05h, 'NDERBORG',0 ; gammel !
LCD_txt1a: db 'HTX SØNDERBORG',0
LCD_txt2: db 'Extern display ',0
LCD_txt3: db 'Indtast Nr ',0
LCD_txt4: db 'Made by Valle ',0
;20 kar fylder:' ',
;- - - - - - - - - - - - - - - - - - - - - - - - - - -
; Koder til at downloade danske karakterer til LCD-en
; Codes for downloading danish characters to the LCD
LCD_cgram:
db 0,0,0,0,0,0,0,0 ; ej brugt
db 0,0,26,5,15,20,31,0 ;æ 1
db 0,1,14,21,21,14,16,0 ;ø 2
db 4,0,14,1,15,17,15,0 ;å 3
db 15,20,20,30,20,20,23,0 ;Æ 4
db 1,14,19,21,25,14,16,0 ;Ø 5
db 4,0,14,17,31,17,17,0 ;Å 6
db 31,21,21,14,14,4,4,0 ;VT 7
;-------------------------------------------------------
; Pauserutine, Breack routine, Ca 1/4 sek.
Pause:
Mov R6, #0ffh ;Flyt hex ff til register 6
Pause1: mov r7, #0ffh
djnz r7, $
djnz R6, Pause1 ;Tæl ned med 1
Ret
;---------------------------------
Kortpause: ; Ca ( 0.5 / 256 ) sek
mov R7, #0FFh
djnz R7, $
ret
;*************************************************************************************************
End
O0ZvcmZhdHRlciA6IE5hdm4KO1Byb2pla3QgICA6IE5hdm4KOyBEYXRvICAgICA6IHh4CgoKCgovKgpkOiAxNS8xLTIwMTAsIMOmbmRyZXQgc8OlIGRlciBrYW4gc2tyaXZlcyDDpsO4w6UsIMOGw5jDhSBpIHRla3N0c3RyaW5nJ2VuLgoKRGVubmUgcnV0aW5lIGVyIGJlcmVnbmV0IHRpbCBhdCBrb3BpZXJlIGluZCBpIGV0IHVDIHByb2pla3QsIGZvciBhdCBvcG7DpSBrb250YWt0IHRpbCAKZXQgTENEIEthcmFrdGVyZGlzcGxheQoKRGVyIGRvd25sb2FkZXMgZGFuc2tlIGthcmFrdGVyZXIgw6YsIMO4LCDDpSwgb2cgw4YsIMOYIG9nIMOFIGkgTENELW1vZHVsZXQgIQpTdGFydGV0IGQuIDIxLzktMDMgcmV2IDI1MDkwMywgMi8xMi0wNiwgMjIvMDEtMjAwNwoKVGhpcyB0ZXh0IGlzIHVzZWQgZm9yIGNvcHlpbmcgaW50byBhIHVDIHByb2plY3QsIGluIG9yZGVyIHRvIGNvbXVuaWNhdGUgd2l0aCBhIApMQ0QgQ2hhcmFjdGVyIG1vZHVsZS4KClRoZSBkYW5pc2ggc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBkb3dubG9hZGVkIGluIHRoZSBMQ0QKClZhbGxlIFRob3LDuAoKCiovCgoKOyRub21vZDUxCQkJO3NlIGJvcnQgZnJhIDgwNTEgcmVlZ2lzdHJlCjskaW5jbHVkZSAoYXQ4OTIwNTEuaW5jKQkJO0Jlbnl0IGlzdGVkZXQgQVRNRUw4OUMyMDUxIGRlZmluaXRpb25lcgoKOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKTkFNRSAgTENERGlzcGxheSAgIAoKOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKOyBLb25zdGFudC0sIEh1a29tbWVsc2VzLSBvZyBQb3J0YmVsw6ZnbmluZwo7IENvbnN0YW50cywgbWVtb3J5IGFuZCBQaW5zIGRlZmluaXRpb25zCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCjsgUGlucy1kZWZpbml0aW9uZXIKCglMQ0RfUlMgICAgICAgICAgRVFVIFAxLjcKCUxDRF9SVyAgICAgICAgICBFUVUgUDEuNgoJTENEX0VOQUJMRSAgICAgIEVRVSBQMS41CglMQ0RfRDQgICAgICAgICAgRVFVIFAxLjQKCUxDRF9ENSAgICAgICAgICBFUVUgUDEuMwoJTENEX0Q2ICAgICAgICAgIEVRVSBQMS4yCglMQ0RfRDcgICAgICAgICAgRVFVIFAxLjEKCjsgTENEX0VOQUJMRSBrYW4gdW5kdsOmcmVzLCBTw6Ugc2thbCBMQ0QnZW4gYmxvdCB2w6ZyZSBlbmFibGV0IGhlbGUgdGlkZW4KOyBBa3RpdiBMQVYgIQoKOyBMQ0RfRU5BQkxFIGlzIG5vdCBuZXNzYXNzYXJ5IG5lZWRlZCwgc2hvdWxkIHRoZW4gYnkgaGFyZHdhcmUgYmUgY29ubmVjdGVkIHRvIGxvdy4KOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOyBSQU1kZWZpbml0aW9uZXIgLyBSYW0tZGVmaW5pdGlvbnMKCgoKOyBkZWZpbml0aW9uIGFmIGtvbnN0YW50ZXIgLyBkZWZpbml0aW9uIG9mIENvbnN0YW50cwoKCgoKCgo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjsgSGVyIHN0YXJ0ZXIgc2VsdmUgcHJvZ3JhbW1ldAo7IEhlcmUgdGhlIHByb2dyYW0gc3RhcnRzCgoKICAgICAgICBPcmcgMGggICAgICAgICAgOyBQcm9ncmFtbWVyIGFzc2VtYmxlcmVzIHRpbCBhdCBzdGFydGUgaSBhZHJlc3NlIDAsIAogICAgICAgICAgICAgICAgICAgICAgICA7IGRlciBlciBhZHJlc3NlbiwgZGVyIHN0YXJ0ZXMgaSB2ZWQgcmVzZXQgIQoKCQkJCiAgICAgICAgam1wIHN0YXJ0Cgo7SGVyIGVyIGdqb3J0IHBsYWRzIHRpbCBpbnRlcnJ1cHR2ZWt0b3Jlci4gRGUsIGRlciBza2FsIGJydWdlcywgc2thbCBVbm1hcmtlcy4KCgoKOwlPUkcgMDNoCQkJOyBJbnRlcnJ1cHQgZnJvbSBleHRlcm4gaW50ZXJydXB0IDAKOwlqbXAgRVgwaW50Cgo7CU9SRyAwQmgJCQk7IEludGVycnVwdCBmcm9tIENvdW50ZXIgMCBvdmVyZmxvdwo7CUptcCBUaW1lcjBpbnQJCTsgSG9wIHRpbCB0aW1lcnJ1dGluZSAvIEp1bXAgdG8gc3Vicm91dGluZQoKOwlPUkcgMTNoCQkJOyBJbnRlcnJ1cHQgZnJvbSBFeHRlcm4gaW50ZXJydXB0IDEKOwlqbXAgRVgxaW50Cgo7CU9SRyAxQmgJCQk7SW50ZXJydXB0IGZyb20gdGltZXIgMQo7CWptcCBUaW1lcgkJO0hvcCB0aWwgdGltZXJydXRpbmUgLyBKdW1wIHRvIHN1YnJvdXRpbmUKCjsJb3JnIDAyM2gJCTsgc2VyaWVsIGludGVycnVwdCB2ZWt0b3IsIHVkbMO4c3QgIGFmIFJJIGVsbGVyIFRJCjsJam1wIHNlcmludAkJOyBDcmVhdGVkIGJ5IFJJIG9yIFRJCgoKClN0YXJ0OgogICAgICAgIE9yZyAzMGggICAgICAgICA7IGhlciBzdGFydGVyIHByb2dyYW1tZXQKICAgICAgICBtb3Ygc3AsICMzMGggICAgOyBmbHl0IC8gTW92ZSBzdGFja3BvaW50ZXIsIGRlZmF1bHQgPSAwN2gKCglDYWxsIExDRF9pbml0CTsgU3RhcnQgTENELWRpc3BsYXlldCBvcCwgb2cgdXBsb2FkIGRhbnNrZSBrYXJha3RlcmVyLgo7Cgo7IFByb2dyYW1tZXQga2FuIHBsYWNlcmVzIGhlcgoKTWl0X3Byb2dyYW06CgovKgoKVGVrc3RiZXNrZWRlciBza3JpdmVzIGZ4LiBzb20gZsO4bGdlcjoKCiAgICAgICAgTW92IGEsICMwMGggICAgICAgICAgICAgOyAxLiBwb3MgcMOlIGxpbmllbiwgZnJhIDAgdGlsIDE5LgogICAgICAgIGNhbGwgUENMMiAgICAgICAgICAgICAgIDsgUENMMSA9IExpbmllIDEsIFBDTDIgPSBMaW5pZSAyLCAKICAgICAgICBtb3YgZHB0ciwgI0xDRF90eHQzICAgICA7IERhdGFwb2ludGVyIHBvaW50cyBhdCB0ZXh0CiAgICAgICAgY2FsbCBMQ0RfUHJpbnRzdHJpbmcgICAgOyBXcml0ZSBtZXNzYWdlLCB0ZXJtaW5hdGVkIHdpdGggYSAwICggWmVybyApCjstLS0tLS0tLS0tCgoKKi8KCgpMb29wOgkJCSA7IFN0b3AgcHJvZ3JhbWFmdmlrbGluZyBoZXIuCglKbXAgTG9vcAkgOyBKbXAgJCAgICAgYmV0eWRlciBvZ3PDpSAiaG9wIHRpbCBzYW1tZSBsaW5pZSIKCjsgSGVyIGtvbW1lciBzdWJydXRpbmVyOjoKCjsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKOyBTdWJydXRpbmVyIHRpbCBMQy1EaXNwbGF5IFN0eXJpbmcKOyBTdWJyb3V0aW5lcyBmb3IgY29udHJvbGxpbmcgdGhlIExDRAo7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpMQ0RfaW5pdDoJIDsgTENEIGluaXRpYWxpZXJpbmcKCiAgICAgICAgbW92IGEsIzUwCkxDRF9pbml0X3NsZWVwc29tZXRpbWU6CTsgV2FpdCBzb21lIHRpbWUgdGlsIGRpc3BsYXlldCBlciBpbml0aWFsaXNlcmV0CiAgICAgICAgY2FsbCBMQ0Rfd3MKICAgICAgICBkam56IEFjYyxMQ0RfaW5pdF9zbGVlcHNvbWV0aW1lCgo7IFNlbmQgc3R5cmVrb2RlciwgZm9yIGF0IExDRCBpbiBpdGlhbGlzZXJlcyB2ZWQgcG93ZXIgb24KOyBzZW5kIGNvbnRyb2wgY29kZXMgZm9yIGluaXRpYXRpbmcKCiAgICAgICAgY2xyIExDRF9SUwogICAgICAgIGNsciBMQ0RfUlcKICAgICAgICBjbHIgTENEX0VOQUJMRQogICAgICAgIG1vdiBhLCMwMDEwMTAwMGIKICAgICAgICBjYWxsIExDRF9zZW5kX2IKICAgICAgICBzZXRiIExDRF9FTkFCTEUKICAgICAgICBjbHIgTENEX0VOQUJMRQogICAgICAgIG1vdiBhLCMwMDEwMTAwMGIKICAgICAgICBjYWxsIExDRF9zZW5kX2IKICAgICAgICBtb3YgYSwjMTExMGIJCTtDdXJzb3Igb24gIQogICAgICAgIGNhbGwgTENEX3NlbmRfYgogICAgICAgIGNhbGwgTENEX2NsZWFyCjsKICAgICAgICBtb3YgYSwjNjQKICAgICAgICBjYWxsIExDRF9zZW5kX2IKCjsgU2VuZCBkYW5za2Uga2FyYWt0ZXJlciB0aWwgTENECgogICAgICAgIG1vdiBEUFRSLCNMQ0RfY2dyYW0KICAgICAgICBtb3YgUjAsIzY0CkxDRF9jZ3JhbV9sYWJlbDoKICAgICAgICBjbHIgYQogICAgICAgIG1vdmMgYSxAQStEUFRSCiAgICAgICAgaW5jIERQVFIKICAgICAgICBjYWxsIExDRF9zZW5kX2QKICAgICAgICBkam56IFIwLExDRF9jZ3JhbV9sYWJlbAogICAgICAgIGNhbGwgTENEX3JldHVybmhvbWUKICAgICAgICByZXQKCjstIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KCkxDRF9yZXR1cm5ob21lOiAgICAgICAgIDsgS2FsZGVzIGZvciBhdCBmbHl0dGUgY3Vyc29yIHRpbCBsaW5pZSAxLCAxLiBwb3MuCiAgICAgICAgcHVzaCBBQ0MJOyBQb3NpdGlvbiB0aGUgY3Vyc29yIGxpbmUgMSBwb3NpdGlvbiAxCiAgICAgICAgbW92IGEsIzEyOAogICAgICAgIGNhbGwgTENEX3NlbmRfYgogICAgICAgIHBvcCBBQ0MKICAgICAgICByZXQKCjstIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KCkxDRF9jbGVhcjogICAgICAgICAgICAgIDsgU2xldHRlciBhbCB0ZWtzdCwgJiBDdXJzZXIgSG9tZSAhCiAgICAgICAgcHVzaCBBQ0MJOyBjbGVhciBkaXNwbGF5CiAgICAgICAgbW92IGEsIzEKICAgICAgICBjYWxsIExDRF9zZW5kX2IKICAgICAgICBwb3AgQUNDCgljYWxsIERlbGF5CglSZXQKCjstIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KCkRlbGF5Ogltb3YgUjUsICMxNQk7IHNob3J0IGRlbGF5CkRlbGF5MTogbW92IFI2LCAjMjUKCQkJZGpueiBSNiwgJAoJCQlkam56IFI1LCBEZWxheTEKCQlSZXQKCjstIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KCmN1cnNlcl9vbjoKICAgICAgICBtb3YgYSwjMTExMGIJCTtDdXJzb3Igb24gIQogICAgICAgIGNhbGwgTENEX3NlbmRfYgogICAgICAgIHJldAo7LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCgpjdXJzZXJfb2ZmOgogICAgICAgIG1vdiBhLCMxMTAwYgkJO0N1cnNvciBvZmYgIQogICAgICAgIGNhbGwgTENEX3NlbmRfYgogICAgICAgIHJldAoKOy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQoKTENEX3ByaW50YzogICAgICAgICAgICAgOyBTZW5kZXIgZW4ga2FyYWt0ZXIgaSBBQ0MKCQkJOyBzZW5kIGNoYXJhY3RlciBpbiBBQ0MKICAgICAgICBjYWxsIExDRF9zZW5kX2QKICAgICAgICByZXQKOy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQoKTENEX3ByaW50c3RyaW5nOiAJOyBTa3JpdmVyIGVuIFN0cmluZywgZGVyIHRlcm1pbmVyZXMgbWVkIGV0IDAsIEJydWdlciBkYXRhcG9pbnRlcmVuIERQVFIKCQkgCQkJOyBXcml0ZXMgYSBzdHJpbmcsIHRlcm1pbmF0ZWQgd2l0aCAiMCIuIFVzZXMgdGhlIERhdGEgUG9pbnRlcgogICAgICAgIHB1c2ggQUNDCkxDRF9wcmludHNfYW5mOgogICAgICAgIGNsciBhCiAgICAgICAgbW92YyBhLEBBK0RQVFIKICAgICAgICBqeiBMQ0RfcHJpbnRzX3dlaXRlcgoKICA7IHRqZWsgZm9yIGRhbnNrZSBrYXJha3RlcmVyCiAgCQlDYWxsIFRqZWtfREsKICA7IFByaW50CiAgICAgICAgY2FsbCBMQ0RfcHJpbnRjCiAgICAgICAgaW5jIERQVFIKICAgICAgICBqbXAgTENEX3ByaW50c19hbmYKTENEX3ByaW50c193ZWl0ZXI6CiAgICAgICAgcG9wIEFDQwogICAgICAgIHJldAoKOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUamVrX0RLOgk7IGhlciB0amVra2VzIG9nIGtvcnJpZ2VyZXMgZm9yIGRhbnNrZSBrYXJha3RlcmVyCgkJCTsgRGF0YSBlciBpIHJlZyBBLgoJY2puZSBhLCAjJ8OmJywgVGpla19ESzEKCW1vdiBhLCAjMDFoCglqbXAgVGpla19ESzk5CTsgdGlsIGJ1bmQgYWYgc3VicnV0aW5lClRqZWtfREsxOgoJY2puZSBhLCAjJ8O4JywgVGpla19ESzIKCW1vdiBhLCAjMDJoCglqbXAgVGpla19ESzk5CTsgdGlsIGJ1bmQgYWYgc3VicnV0aW5lClRqZWtfREsyOgoJY2puZSBhLCAjJ8OlJywgVGpla19ESzMKCW1vdiBhLCAjMDNoCglqbXAgVGpla19ESzk5CTsgdGlsIGJ1bmQgYWYgc3VicnV0aW5lClRqZWtfREszOgoJY2puZSBhLCAjJ8OGJywgVGpla19ESzQKCW1vdiBhLCAjMDRoCglqbXAgVGpla19ESzk5CTsgdGlsIGJ1bmQgYWYgc3VicnV0aW5lClRqZWtfREs0OgoJY2puZSBhLCAjJ8OYJywgVGpla19ESzUKCW1vdiBhLCAjMDVoCglqbXAgVGpla19ESzk5CTsgdGlsIGJ1bmQgYWYgc3VicnV0aW5lClRqZWtfREs1OgoJY2puZSBhLCAjJ8OFJywgVGpla19ESzYKCW1vdiBhLCAjMDZoClRqZWtfREs2OgpUamVrX0RLOTk6CgoJUmV0Cgo7LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCgpMQ0Rfc2VuZF9iOiAJOyBzZW5kZXIgc3R5cmVrb2RlIGkgQUNDIHRpbCBMQ0QsIFRpbCBhdCBpbmRzdGlsbGUgZGlzcGxheWV0ICEKCQk7IFNlbmQgQ29tbWFuZHMgaW4gQUNDLCB0byBjb250cm9sIHRoZSBMQ0QKICAgICAgICBjbHIgTENEX1JTCiAgICAgICAgY2xyIExDRF9SVwogICAgICAgIGptcCBMQ0Rfc2VuZAoKOy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQoKO3NlbmRlciBEYXRhIGkgQWNjIHRpbCBMQ0QsIFNlbmRlciAiQVNDSUkiLiBEZXQgZXIgZG9nIHPDpWxlZGVzIGkgCjsgcmVhbGl0ZXRlbiwgYXQgZGVyIHNlbmRlcyBlbiB0YWx2w6ZyZGksIHDDpSBkZW4gYWRyZXNzZSBpIExDRCdlbnMgCjtST00sIGh2b3JpIGV0IG3DuG5zdGVyIHDDpSBldCBib2dzdGF2IGVyIGdlbXQuIAo7IERlIG5lZGVyc3RlIDggZXIgdWRsYWd0IGkgUkFNLCBvZyBkZXQgZXIgaGVyaSwgZGVyIGthbiBkb3dubG9hZGVzIAo7IG5hdGlvbmFsZSBrYXJha3RlcmVyLiAKTENEX3NlbmRfZDoKICAgICAgICBjbHIgTENEX1JXCiAgICAgICAgc2V0YiBMQ0RfUlMKTENEX3NlbmQ6CiAgICAgICAgbW92IGMsQUNDLjcgICAgICAgIDsgaGlnaC1uaWJibGUgc2VuZGVzCiAgICAgICAgbW92IExDRF9ENyxjCiAgICAgICAgbW92IGMsQUNDLjYKICAgICAgICBtb3YgTENEX0Q2LGMKICAgICAgICBtb3YgYyxBQ0MuNQogICAgICAgIG1vdiBMQ0RfRDUsYwogICAgICAgIG1vdiBjLEFDQy40CiAgICAgICAgbW92IExDRF9ENCxjCjsKICAgICAgICBzZXRiIExDRF9FTkFCTEUKICAgICAgICBjYWxsIExDRF93cwogICAgICAgIGNsciBMQ0RfRU5BQkxFCjsKICAgICAgICBtb3YgYyxBQ0MuMyAgICAgICAgOyBsb3ctbmliYmxlIHNlbmRlcwogICAgICAgIG1vdiBMQ0RfRDcsYwogICAgICAgIG1vdiBjLEFDQy4yCiAgICAgICAgbW92IExDRF9ENixjCiAgICAgICAgbW92IGMsQUNDLjEKICAgICAgICBtb3YgTENEX0Q1LGMKICAgICAgICBtb3YgYyxBQ0MuMAogICAgICAgIG1vdiBMQ0RfRDQsYwo7CiAgICAgICAgc2V0YiBMQ0RfRU5BQkxFCiAgICAgICAgY2FsbCBMQ0Rfd3MKICAgICAgICBjbHIgTENEX0VOQUJMRQogICAgICAgIHJldAoKOy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQoKOyAgMS42NG1zIHZlbnRlc2zDuGpmZSAvIFdhaXQgMS42NCBtcwo7ICBBbnRhbCBtYXNraW5jeWtsZXI6IDE2NDAKTENEX3dzOgogICAgICAgIHB1c2ggcHN3CiAgICAgICAgcHVzaCAwCiAgICAgICAgbW92ICAwLCMyMzIKTENEX3dzX2xhYmVsQToKICAgICAgICBub3AKICAgICAgICBub3AKICAgICAgICBub3AKICAgICAgICBub3AKICAgICAgICBub3AKICAgICAgICBkam56IDAsTENEX3dzX2xhYmVsQQogICAgICAgIG5vcAogICAgICAgIG5vcAogICAgICAgIHBvcCAwCiAgICAgICAgcG9wIHBzdwogICAgICAgIHJldAoKOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKOyBTdWJyb3V0aW5lciB0aWwgYXQgcG9zaXRpb25lcmUgY3Vyc29yZW46CjsgZGV0LCBkZXIgc3TDpXIgaSBkaXNwbGF5ZXQgc2xldHRlcyBpa2tlIAo7IFN1YnJvdXRpbmVzIGZvciBwb3NpdGlvbmluZyB0aGUgQ3Vyc29yCjsgQ29udGVudCBpbiBBIHdpbGwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoYXQgcG9zaXRpb24gb24gdGhlIGxpbmUgKCAwIC0gMTkgZCApCgo7U3Vicm91dGluZSB0aWwgcG9zaXRpb25lcmluZyBhZiBsaW5pZSAxLCAyLCAzIGVsbGVyIDQuIGkgTENELWRpc3BsYXkKCjtJbnB1dDogSW5kaG9sZCBpIEFjYyBlciBYLXbDpnJkaSBww6UgbGluaWVuICggMCB0aWwgMTkgZCApICEhCjsKUENMMToJam1wIFBDTF85OQk7IExpbmllIDEKClBDTDI6CWFkZCBhLCAjNDBoCTsgTGluaWUgMgoJCWptcCBQQ0xfOTkKClBDTDM6CWFkZCBhLCAjMTRoCTsgTGluaWUgMwoJCWptcCBQQ0xfOTkKClBDTDQ6CWFkZCBhLCAjNTRoCTsgTGluaWUgNAoKUENMXzk5OglhZGQgYSwgIzgwaAoJCWNhbGwgbGNkX3NlbmRfYgoJCXJldAoKOy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQoKO0Vrc2VtcGxlciBww6UgVGVrc3RiZXNrZWRlciwgTWF4IDIwIGthcmFrdGVyZXIgcHIgbGluaWUKOyBEZSBhZnNsdXR0ZXMgbWVkIGV0ICcwJwo7IEV4YW1wbGVzIG9mIHRleHRtZXNzYWdlcy4gTWF4IDIwIENoYXIuIHByLiBsaW5lCjsgTGluZXMgYXJlIHRlcm1pbmF0ZWQgYnkgIjAiCgo7IExDRF90eHQxOglkYiAnSFRYIFMnLCAwNWgsICdOREVSQk9SRycsMCAgOyBnYW1tZWwgIQpMQ0RfdHh0MWE6CWRiICdIVFggU8OYTkRFUkJPUkcnLDAKTENEX3R4dDI6CWRiICdFeHRlcm4gZGlzcGxheSAnLDAKTENEX3R4dDM6CWRiICdJbmR0YXN0IE5yICcsMApMQ0RfdHh0NDoJZGIgJ01hZGUgYnkgIFZhbGxlICcsMAo7MjAga2FyIGZ5bGRlcjonICAgICAgICAgICAgICAgICAgICAnLCAgICAgICAgICAgICAKCjstIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAKCjsgS29kZXIgdGlsIGF0IGRvd25sb2FkZSBkYW5za2Uga2FyYWt0ZXJlciB0aWwgTENELWVuCjsgQ29kZXMgZm9yIGRvd25sb2FkaW5nIGRhbmlzaCBjaGFyYWN0ZXJzIHRvIHRoZSBMQ0QKTENEX2NncmFtOgogICAgICAgIGRiIDAsMCwwLDAsMCwwLDAsMCAgICAgICAgICA7ICAgICAgIGVqIGJydWd0CiAgICAgICAgZGIgMCwwLDI2LDUsMTUsMjAsMzEsMAkJO8OmICAgICAgMQogICAgICAgIGRiIDAsMSwxNCwyMSwyMSwxNCwxNiwwCQk7w7ggICAgICAyCiAgICAgICAgZGIgNCwwLDE0LDEsMTUsMTcsMTUsMAkJO8OlCQkzCiAgICAgICAgZGIgMTUsMjAsMjAsMzAsMjAsMjAsMjMsMAk7w4YgICAgICA0CiAgICAgICAgZGIgMSwxNCwxOSwyMSwyNSwxNCwxNiwwCTvDmCAgICAgIDUKICAgICAgICBkYiA0LDAsMTQsMTcsMzEsMTcsMTcsMAkJO8OFICAgICAgNgogICAgICAgIGRiIDMxLDIxLDIxLDE0LDE0LDQsNCwwCQk7VlQgICAgIDcKCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgo7IFBhdXNlcnV0aW5lLCBCcmVhY2sgcm91dGluZSwgIENhIDEvNCBzZWsuCgpQYXVzZToKCU1vdiBSNiwgIzBmZmgJCTtGbHl0IGhleCBmZiB0aWwgcmVnaXN0ZXIgNgpQYXVzZTE6CW1vdiByNywgIzBmZmgKCWRqbnogcjcsICQKCWRqbnogUjYsIFBhdXNlMQkJCTtUw6ZsIG5lZCBtZWQgMQoJUmV0CjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCktvcnRwYXVzZTogICAgICA7IENhICggMC41IC8gMjU2ICkgc2VrCgltb3YgUjcsICMwRkZoCglkam56IFI3LCAkCglyZXQKCjsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogIAlFbmQ=