1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | TTL "LCDTest (Lab 5)" ****************************************************************** * 1) HEADER block - overall info about the program * Project name: LCDTest * Author(s): Alex and Travis * Date: 4 Oct 2012 * Description: Writes 'hi' to the screen ****************************************************************** ****************************************************************** CODE EQU $2000 ;where our code can begin on EVB VPUTCHAR EQU $EE86 ;send character in B to output device CR EQU $0D ;Carriage Return PORTA EQU $0000 tenths RMB 1 ;reserve a memory byte for tenth of seconds seconds RMB 1 ;reserve a memory byte for seconds tens RMB 1 ****************************************************************** ****************************************************************** * 4) CODE section - actual program code * * This is all set-up. Output welcome message to the terminal, * * Print "Ultimate Watch" to the LCD, and check for the initial * * Button press * ****************************************************************** ORG CODE ;tell assembler where to begin object code ;main program body follows Main ldaa #LINIT ;set accumulator to "LINIT" value 0 jsr LCD ;initialize LCD ldx #Title ;load x with the string ldaa #LWRSTR ;load A with the address of the write string subroutine jsr LCD ;execute LWRSTR ldx #Greet ;Point X at the greeting message jsr PUTS ;Output the greeting message ldx #$C0 ;Point to first character, second line ldaa #LGOTO ; jsr LCD ;Point the cursor there ldab #0 ; ldaa #LWRDEC ; jsr LCD ;Output 0 jsr LCD ;Output another 0 ldab #':' ;Load B with a colon to be output ldaa #LWRCHR ;Output colon to the screen jsr LCD ;Do it ldab #0 ; ldaa #LWRDEC ; jsr LCD ;Output 1 more 0 clr tens ; clr seconds ;Clear each variable clr tenths ; Loop ldaa PORTA ;Load Accumulator A with the values of Port A ANDA #%10000000 ;Mask with $80 to watch only PA7 bne Loop ;If it is still high, loop. Debounc cmpb #20 ;Wait 20ms to ensure proper debouncing beq Clock ;When debounced, start the clock dbl ldx #0 ;1ms loop dex ; cpx #10000 ; beq dbl ; incb ;Increment debounce counter bra Debounc ; **************************************************************************** * The code following this is all run after the button is pushed initially * * but before it starts the stopwatch part of the program * **************************************************************************** Clock ldaa PORTA ;Check status of button ANDA #%10000000 ;Is it still pushed? bne Clock ;If not, check again ldx #$C0 ; ldaa #LGOTO ; jsr LCD ;Point to first character, second line ldab tens ;load b with tens counter ldaa #LWRDEC ;get ready to print tenths to fourth character, second row jsr LCD ;do it ldab seconds ;load b with seconds counter ldaa #LWRDEC ;get ready to print tenths to fourth character, second row jsr LCD ;do it ldab #':' ;Load B with a colon to be output ldaa #LWRCHR ;Output colon to the screen jsr LCD ;Do it ldab tenths ;load b with tenths counter ldaa #LWRDEC ;get ready to print tenths to fourth character, second row jsr LCD ;do it ldd #100 ;If so, get ready to delay 100ms jsr DelayN ;Delay 100ms ldaa tenths ;Check the tenths counter cmpa #10 ;Is it ten? beq secondi ;If so, branch to seconds incrementer tenthsi ldaa tenths ;Increment tenths counter inca ; staa tenths ; ldab tenths ;load b with tenths counter bra Clock ;Output and check button status secondi clra ; staa tenths ;clear tenths counter ldaa seconds cmpa #10 ;Is seconds 10? beq tensi ;If so, branch to tens incrementer ldaa seconds ; inca ;Otherwise, increment seconds staa seconds ; bra Clock ;Output and check button status tensi clra ;Clear seconds staa seconds ; ldaa tens ; inca ;Increment tens staa tens ; bra Clock ;Output and check button status quit ldx #Exit jsr PUTS swi ;return to monitor on EVB PUTS ldab 0,x ;get 1 char from string beq PSDONE ;done if terminating null jsr PUTCHAR ;output this char inx ;advance X to next char bra PUTS ;continue PSDONE rts ;done, return to caller ; single character (in B) output routine PUTCHAR pshx ;save caller's X ldx VPUTCHAR ;fetch address of monitor rtn jsr 0,X ;call monitor rtn. pulx ;restore caller's X rts DelayN bsr Delay1 ;go delay 1 millisecond dbne D,DelayN ;dec 'N' & continue till zero rts * Delay1: delay 1 millisecond via software, * assumes F=24 MHz (and no interrupts) * all registers preserved for caller Delay1 pshx ;2~ preserve registers used here ldx #5997 ;2~ iterations of Dloop for 1ms. Dloop dex ;1~ ] bne Dloop ;3~ ] 5997 * 4~ = 23988~ pulx ;3~ recover used registers rts ;5~ 23988 + 12 = 24000~ = 1ms. ; constant data definitions (FCB,FDB,FCC)... Title FCC "Ultimate Watch" FCB 0 Greet FCC "Welcome to the stopwatch program. Press and hold the button to start the clock." FCB 0 Exit FCC "Thanks, have a good day." FCB CR,CR,CR, 0 ****************************************************************** #include 'LCDdriver.asm' ; tell assembler end of assembly source code END |
ICAgICAgICBUVEwgICAgICJMQ0RUZXN0IChMYWIgNSkiCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAxKSBIRUFERVIgYmxvY2sgLSBvdmVyYWxsIGluZm8gYWJvdXQgdGhlIHByb2dyYW0KKiBQcm9qZWN0IG5hbWU6IExDRFRlc3QKKiBBdXRob3Iocyk6IEFsZXggYW5kIFRyYXZpcwoqIERhdGU6IDQgT2N0IDIwMTIKKiBEZXNjcmlwdGlvbjogV3JpdGVzICdoaScgdG8gdGhlIHNjcmVlbgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDT0RFICAgIEVRVSAgICAgJDIwMDAgICAgICAgO3doZXJlIG91ciBjb2RlIGNhbiBiZWdpbiBvbiBFVkIKVlBVVENIQVIgRVFVICAgICRFRTg2ICAgICAgIDtzZW5kIGNoYXJhY3RlciBpbiBCIHRvIG91dHB1dCBkZXZpY2UKQ1IgICAgICBFUVUgICAgICQwRCAgICAgICAgIDtDYXJyaWFnZSBSZXR1cm4KUE9SVEEgICBFUVUgICAgICQwMDAwCnRlbnRocyAgUk1CICAgICAxICAgICAgICAgICA7cmVzZXJ2ZSBhIG1lbW9yeSBieXRlIGZvciB0ZW50aCBvZiBzZWNvbmRzCnNlY29uZHMgUk1CICAgICAxICAgICAgICAgICA7cmVzZXJ2ZSBhIG1lbW9yeSBieXRlIGZvciBzZWNvbmRzCnRlbnMgICAgUk1CICAgICAxCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIDQpIENPREUgc2VjdGlvbiAtIGFjdHVhbCBwcm9ncmFtIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBUaGlzIGlzIGFsbCBzZXQtdXAuICBPdXRwdXQgd2VsY29tZSBtZXNzYWdlIHRvIHRoZSB0ZXJtaW5hbCwgICAqCiogUHJpbnQgIlVsdGltYXRlIFdhdGNoIiB0byB0aGUgTENELCBhbmQgY2hlY2sgZm9yIHRoZSBpbml0aWFsICAgKgoqIEJ1dHRvbiBwcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgIE9SRyAgICAgQ09ERSAgICAgICAgO3RlbGwgYXNzZW1ibGVyIHdoZXJlIHRvIGJlZ2luIG9iamVjdCBjb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7bWFpbiBwcm9ncmFtIGJvZHkgZm9sbG93cwpNYWluICAgIGxkYWEgICAgI0xJTklUICAgICAgO3NldCBhY2N1bXVsYXRvciB0byAiTElOSVQiIHZhbHVlIDAKICAgICAgICBqc3IgICAgIExDRCAgICAgICAgIDtpbml0aWFsaXplIExDRAogICAgICAgIGxkeCAgICAgI1RpdGxlICAgICAgO2xvYWQgeCB3aXRoIHRoZSBzdHJpbmcKICAgICAgICBsZGFhICAgICNMV1JTVFIgICAgIDtsb2FkIEEgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgd3JpdGUgc3RyaW5nIHN1YnJvdXRpbmUKICAgICAgICBqc3IgICAgIExDRCAgICAgICAgIDtleGVjdXRlIExXUlNUUgogICAgICAgIGxkeCAgICAgI0dyZWV0ICAgICAgO1BvaW50IFggYXQgdGhlIGdyZWV0aW5nIG1lc3NhZ2UKICAgICAgICBqc3IgICAgIFBVVFMgICAgICAgIDtPdXRwdXQgdGhlIGdyZWV0aW5nIG1lc3NhZ2UKCiAgICAgICAgbGR4ICAgICAjJEMwICAgICAgICA7UG9pbnQgdG8gZmlyc3QgY2hhcmFjdGVyLCBzZWNvbmQgbGluZQogICAgICAgIGxkYWEgICAgI0xHT1RPICAgICAgOwogICAgICAgIGpzciAgICAgTENEICAgICAgICAgO1BvaW50IHRoZSBjdXJzb3IgdGhlcmUKICAgICAgICBsZGFiICAgICMwICAgICAgICAgIDsKICAgICAgICBsZGFhICAgICNMV1JERUMgICAgIDsKICAgICAgICBqc3IgICAgIExDRCAgICAgICAgIDtPdXRwdXQgMAogICAgICAgIGpzciAgICAgTENEICAgICAgICAgO091dHB1dCBhbm90aGVyIDAKICAgICAgICBsZGFiICAgICMnOicgICAgICAgIDtMb2FkIEIgd2l0aCBhIGNvbG9uIHRvIGJlIG91dHB1dAogICAgICAgIGxkYWEgICAgI0xXUkNIUiAgICAgO091dHB1dCBjb2xvbiB0byB0aGUgc2NyZWVuCiAgICAgICAganNyICAgICBMQ0QgICAgICAgICA7RG8gaXQKICAgICAgICBsZGFiICAgICMwICAgICAgICAgIDsKICAgICAgICBsZGFhICAgICNMV1JERUMgICAgIDsKICAgICAgICBqc3IgICAgIExDRCAgICAgICAgIDtPdXRwdXQgMSBtb3JlIDAKICAgICAgICBjbHIgICAgIHRlbnMgICAgICAgIDsKICAgICAgICBjbHIgICAgIHNlY29uZHMgICAgIDtDbGVhciBlYWNoIHZhcmlhYmxlCiAgICAgICAgY2xyICAgICB0ZW50aHMgICAgICA7CiAgICAgICAgCgpMb29wICAgIGxkYWEgICAgUE9SVEEgICAgICAgO0xvYWQgQWNjdW11bGF0b3IgQSB3aXRoIHRoZSB2YWx1ZXMgb2YgUG9ydCBBCiAgICAgICAgQU5EQSAgICAjJTEwMDAwMDAwICAgICAgICAgICAgICAgICAgICA7TWFzayB3aXRoICQ4MCB0byB3YXRjaCBvbmx5IFBBNwogICAgICAgIGJuZSAgICAgTG9vcCAgICAgICAgO0lmIGl0IGlzIHN0aWxsIGhpZ2gsIGxvb3AuCkRlYm91bmMgY21wYiAgICAjMjAgICAgICAgICA7V2FpdCAyMG1zIHRvIGVuc3VyZSBwcm9wZXIgZGVib3VuY2luZwogICAgICAgIGJlcSAgICAgQ2xvY2sgICAgICAgO1doZW4gZGVib3VuY2VkLCBzdGFydCB0aGUgY2xvY2sKZGJsICAgICBsZHggICAgICMwICAgICAgICAgIDsxbXMgbG9vcAogICAgICAgIGRleCAgICAgICAgICAgICAgICAgOwogICAgICAgIGNweCAgICAgIzEwMDAwICAgICAgOwogICAgICAgIGJlcSAgICAgZGJsICAgICAgICAgOwogICAgICAgIGluY2IgICAgICAgICAgICAgICAgO0luY3JlbWVudCBkZWJvdW5jZSBjb3VudGVyCiAgICAgICAgYnJhICAgICBEZWJvdW5jICAgICA7CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogVGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgaXMgYWxsIHJ1biBhZnRlciB0aGUgYnV0dG9uIGlzIHB1c2hlZCBpbml0aWFsbHkgICoKKiBidXQgYmVmb3JlIGl0IHN0YXJ0cyB0aGUgc3RvcHdhdGNoIHBhcnQgb2YgdGhlIHByb2dyYW0gICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgIApDbG9jayAgIGxkYWEgICAgUE9SVEEgICAgICAgO0NoZWNrIHN0YXR1cyBvZiBidXR0b24KICAgICAgICBBTkRBICAgICMlMTAwMDAwMDAgIDtJcyBpdCBzdGlsbCBwdXNoZWQ/CiAgICAgICAgYm5lICAgICBDbG9jayAgICAgICA7SWYgbm90LCBjaGVjayBhZ2FpbgoKICAgICAgICBsZHggICAgICMkQzAgICAgICAgIDsKICAgICAgICBsZGFhICAgICNMR09UTyAgICAgIDsKICAgICAgICBqc3IgICAgIExDRCAgICAgICAgIDtQb2ludCB0byBmaXJzdCBjaGFyYWN0ZXIsIHNlY29uZCBsaW5lCgogICAgICAgIGxkYWIgICAgdGVucyAgICAgICAgO2xvYWQgYiB3aXRoIHRlbnMgY291bnRlcgogICAgICAgIGxkYWEgICAgI0xXUkRFQyAgICAgO2dldCByZWFkeSB0byBwcmludCB0ZW50aHMgdG8gZm91cnRoIGNoYXJhY3Rlciwgc2Vjb25kIHJvdwogICAgICAgIGpzciAgICAgTENEICAgICAgICAgO2RvIGl0CgogICAgICAgIGxkYWIgICAgc2Vjb25kcyAgICAgO2xvYWQgYiB3aXRoIHNlY29uZHMgY291bnRlcgogICAgICAgIGxkYWEgICAgI0xXUkRFQyAgICAgO2dldCByZWFkeSB0byBwcmludCB0ZW50aHMgdG8gZm91cnRoIGNoYXJhY3Rlciwgc2Vjb25kIHJvdwogICAgICAgIGpzciAgICAgTENEICAgICAgICAgO2RvIGl0CiAgICAgICAgCiAgICAgICAgbGRhYiAgICAjJzonICAgICAgICA7TG9hZCBCIHdpdGggYSBjb2xvbiB0byBiZSBvdXRwdXQKICAgICAgICBsZGFhICAgICNMV1JDSFIgICAgIDtPdXRwdXQgY29sb24gdG8gdGhlIHNjcmVlbgogICAgICAgIGpzciAgICAgTENEICAgICAgICAgO0RvIGl0CiAgICAgICAgCiAgICAgICAgbGRhYiAgICB0ZW50aHMgICAgICA7bG9hZCBiIHdpdGggdGVudGhzIGNvdW50ZXIKICAgICAgICBsZGFhICAgICNMV1JERUMgICAgIDtnZXQgcmVhZHkgdG8gcHJpbnQgdGVudGhzIHRvIGZvdXJ0aCBjaGFyYWN0ZXIsIHNlY29uZCByb3cKICAgICAgICBqc3IgICAgIExDRCAgICAgICAgIDtkbyBpdAogICAgICAgIAogICAgICAgIAogICAgICAgIGxkZCAgICAgIzEwMCAgICAgICAgO0lmIHNvLCBnZXQgcmVhZHkgdG8gZGVsYXkgMTAwbXMKICAgICAgICBqc3IgICAgIERlbGF5TiAgICAgIDtEZWxheSAxMDBtcwogICAgICAgIGxkYWEgICAgdGVudGhzICAgICAgO0NoZWNrIHRoZSB0ZW50aHMgY291bnRlcgogICAgICAgIGNtcGEgICAgIzEwICAgICAgICAgO0lzIGl0IHRlbj8KICAgICAgICBiZXEgICAgIHNlY29uZGkgICAgIDtJZiBzbywgYnJhbmNoIHRvIHNlY29uZHMgaW5jcmVtZW50ZXIKICAgICAgICAKdGVudGhzaSBsZGFhICAgIHRlbnRocyAgICAgIDtJbmNyZW1lbnQgdGVudGhzIGNvdW50ZXIKICAgICAgICBpbmNhICAgICAgICAgICAgICAgIDsKICAgICAgICBzdGFhICAgIHRlbnRocyAgICAgIDsKICAgICAgICBsZGFiICAgIHRlbnRocyAgICAgIDtsb2FkIGIgd2l0aCB0ZW50aHMgY291bnRlcgogICAgICAgIGJyYSAgICAgQ2xvY2sgICAgICAgO091dHB1dCBhbmQgY2hlY2sgYnV0dG9uIHN0YXR1cwogICAgICAgIApzZWNvbmRpIGNscmEgICAgICAgICAgICAgICAgOwogICAgICAgIHN0YWEgICAgdGVudGhzICAgICAgO2NsZWFyIHRlbnRocyBjb3VudGVyCiAgICAgICAgbGRhYSAgICBzZWNvbmRzCiAgICAgICAgY21wYSAgICAjMTAgICAgICAgICA7SXMgc2Vjb25kcyAxMD8KICAgICAgICBiZXEgICAgIHRlbnNpICAgICAgIDtJZiBzbywgYnJhbmNoIHRvIHRlbnMgaW5jcmVtZW50ZXIKICAgICAgICBsZGFhICAgIHNlY29uZHMgICAgIDsKICAgICAgICBpbmNhICAgICAgICAgICAgICAgIDtPdGhlcndpc2UsIGluY3JlbWVudCBzZWNvbmRzCiAgICAgICAgc3RhYSAgICBzZWNvbmRzICAgICA7CiAgICAgICAgYnJhICAgICBDbG9jayAgICAgICA7T3V0cHV0IGFuZCBjaGVjayBidXR0b24gc3RhdHVzCgp0ZW5zaSAgIGNscmEgICAgICAgICAgICAgICAgO0NsZWFyIHNlY29uZHMKICAgICAgICBzdGFhICAgIHNlY29uZHMgICAgIDsKICAgICAgICBsZGFhICAgIHRlbnMgICAgICAgIDsKICAgICAgICBpbmNhICAgICAgICAgICAgICAgIDtJbmNyZW1lbnQgdGVucwogICAgICAgIHN0YWEgICAgdGVucyAgICAgICAgOwogICAgICAgIGJyYSAgICAgQ2xvY2sgICAgICAgO091dHB1dCBhbmQgY2hlY2sgYnV0dG9uIHN0YXR1cwoKCgoKCgpxdWl0ICAgIGxkeCAgICAgI0V4aXQKICAgICAgICBqc3IgICAgIFBVVFMKICAgICAgICBzd2kgICAgICAgICAgICAgICAgIDtyZXR1cm4gdG8gIG1vbml0b3Igb24gRVZCCgoKCgoKCgogICAgICAgICAgICAgICAgClBVVFMgICAgbGRhYiAgICAwLHggICAgICAgICA7Z2V0IDEgY2hhciBmcm9tIHN0cmluZwogICAgICAgIGJlcSAgICAgUFNET05FICAgICAgO2RvbmUgaWYgdGVybWluYXRpbmcgbnVsbAogICAgICAgIGpzciAgICAgUFVUQ0hBUiAgICAgO291dHB1dCB0aGlzIGNoYXIKICAgICAgICBpbnggICAgICAgICAgICAgICAgIDthZHZhbmNlIFggdG8gbmV4dCBjaGFyCiAgICAgICAgYnJhICAgICBQVVRTICAgICAgICA7Y29udGludWUKUFNET05FICBydHMgICAgICAgICAgICAgICAgIDtkb25lLCByZXR1cm4gdG8gY2FsbGVyCgo7IHNpbmdsZSBjaGFyYWN0ZXIgKGluIEIpIG91dHB1dCByb3V0aW5lClBVVENIQVIgcHNoeCAgICAgICAgICAgICAgICA7c2F2ZSBjYWxsZXIncyBYCiAgICAgICAgbGR4ICAgICBWUFVUQ0hBUiAgICA7ZmV0Y2ggYWRkcmVzcyBvZiBtb25pdG9yIHJ0bgogICAgICAgIGpzciAgICAgMCxYICAgICAgICAgO2NhbGwgbW9uaXRvciBydG4uCiAgICAgICAgcHVseCAgICAgICAgICAgICAgICA7cmVzdG9yZSBjYWxsZXIncyBYCiAgICAgICAgcnRzCgpEZWxheU4gIGJzciAgICAgRGVsYXkxICAgICAgO2dvIGRlbGF5IDEgbWlsbGlzZWNvbmQKICAgICAgICBkYm5lICAgIEQsRGVsYXlOICAgIDtkZWMgJ04nICYgY29udGludWUgdGlsbCB6ZXJvCiAgICAgICAgcnRzCgoqIERlbGF5MTogZGVsYXkgMSBtaWxsaXNlY29uZCB2aWEgc29mdHdhcmUsCiogYXNzdW1lcyBGPTI0IE1IeiAoYW5kIG5vIGludGVycnVwdHMpCiogYWxsIHJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIGNhbGxlcgoKRGVsYXkxICBwc2h4ICAgICAgICAgICAgICAgIDsyfiBwcmVzZXJ2ZSByZWdpc3RlcnMgdXNlZCBoZXJlCiAgICAgICAgbGR4ICAgICAjNTk5NyAgICAgICA7Mn4gaXRlcmF0aW9ucyBvZiBEbG9vcCBmb3IgMW1zLgpEbG9vcCAgIGRleCAgICAgICAgICAgICAgICAgOzF+IF0KICAgICAgICBibmUgICAgIERsb29wICAgICAgIDszfiBdIDU5OTcgKiA0fiA9IDIzOTg4fgogICAgICAgIHB1bHggICAgICAgICAgICAgICAgOzN+IHJlY292ZXIgdXNlZCByZWdpc3RlcnMKICAgICAgICBydHMgICAgICAgICAgICAgICAgIDs1fiAyMzk4OCArIDEyID0gMjQwMDB+ID0gMW1zLgogICAgICAgICAgICAgICAgCjsgY29uc3RhbnQgZGF0YSBkZWZpbml0aW9ucyAoRkNCLEZEQixGQ0MpLi4uClRpdGxlICAgRkNDICAgICAiVWx0aW1hdGUgV2F0Y2giCiAgICAgICAgRkNCICAgICAwCkdyZWV0ICAgRkNDICAgICAiV2VsY29tZSB0byB0aGUgc3RvcHdhdGNoIHByb2dyYW0uICBQcmVzcyBhbmQgaG9sZCB0aGUgYnV0dG9uIHRvIHN0YXJ0IHRoZSBjbG9jay4iCiAgICAgICAgRkNCICAgICAwCkV4aXQgICAgRkNDICAgICAiVGhhbmtzLCBoYXZlIGEgZ29vZCBkYXkuIgogICAgICAgIEZDQiAgICAgQ1IsQ1IsQ1IsIDAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoKCiNpbmNsdWRlICdMQ0Rkcml2ZXIuYXNtJwo7IHRlbGwgYXNzZW1ibGVyIGVuZCBvZiBhc3NlbWJseSBzb3VyY2UgY29kZQogICAgICAgIEVORA==


