diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..f191725 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,67 @@ + +RCS file: RCS/keypad.asm,v +Working file: keypad.asm +head: 1.34 +branch: +locks: strict + tundra: 1.34 +access list: +symbolic names: +keyword substitution: kv +total revisions: 11; selected revisions: 11 +description: +PIC Based Keypad Decoding System +---------------------------- +revision 1.34 locked by: tundra; +date: 2002/06/18 16:44:33; author: tundra; state: Exp; lines: +3 -3 +Fixed bug in serial output bit count setup. +---------------------------- +revision 1.33 +date: 2002/06/05 15:07:58; author: tundra; state: Exp; lines: +3 -3 +Changed keypad scan delay to a nominal 125ms. +---------------------------- +revision 1.32 +date: 2002/06/05 14:12:54; author: tundra; state: Exp; lines: +17 -2 +Added a nominal 333ms delay between keyboard scans. This is needed +to limit the keystroke repeat rate. +---------------------------- +revision 1.31 +date: 2002/05/29 17:22:02; author: tundra; state: Exp; lines: +3 -3 +Changed DEBOUNCE_TIME to maintain 5ms interval between debounce +read attempts. +---------------------------- +revision 1.30 +date: 2002/05/29 17:20:06; author: tundra; state: Exp; lines: +5 -5 +Changed basic TMR0 interval to 480us. +---------------------------- +revision 1.24 +date: 2002/05/28 19:06:36; author: tundra; state: Exp; lines: +3 -2 +Fixed bug in serial clocking to reset clock at the end of clocking +cycle. +---------------------------- +revision 1.23 +date: 2002/05/28 19:03:00; author: tundra; state: Exp; lines: +41 -18 +Added serial output logic. +---------------------------- +revision 1.22 +date: 2002/05/28 18:35:36; author: tundra; state: Exp; lines: +86 -29 +Added logic to select serial or parallel output at init time. +Completed parallel output routine. Wrote skeleton of serial output +routine. +---------------------------- +revision 1.21 +date: 2002/05/28 15:47:18; author: tundra; state: Exp; lines: +11 -9 +Cleaned up and added explanatory comments. +---------------------------- +revision 1.2 +date: 2002/05/28 15:18:33; author: tundra; state: Exp; lines: +48 -13 +Changed basic TMR0 interrupt interval to 1ms (previously 10ms). +Split key read into separate debounce and translate routines. +Debounce is now defined to be DEBOUNCE_COUNT consecutive reads +with no change on the keyboard. A wait of DEBOUNCE_TIME TMR0 +interrupt ticks is inserted between each keyboard read attempt. +---------------------------- +revision 1.1 +date: 2002/05/22 13:24:46; author: tundra; state: Exp; +Initial revision +============================================================================= diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d8afaf4 --- /dev/null +++ b/Makefile @@ -0,0 +1,59 @@ +# Makefile for PIC keypad.asm embedded keypad controller +# $Id: Makefile,v 1.1 2002/05/05 22:25:29 tundra Exp tundra $ + +#BURN_PGM = c:/usr/local/PIC/pp/pp +#BURN_OPT = "-!" +#VRFY_OPT = "-!v" + + +BURN_PGM = c:/usr/local/PIC/fpp/fppdos.exe +GENERAL_OPT = -! -h3:1 -t20 +DUMP_OPT = -d +VRFY_OPT = -v +ERASE_OPT = -e +INC_DIR = ../include +SRC_FILE = keypad.asm + +RELEASE_FILES = keypad.asm keypad-license.txt readme.txt +RELEASE_FILES1 = keypad.hex keypad.lst keypad.xrf +RELEASE_DIR = Latest-Release +SCHEMATIC_DIR = Schematic + + +ASM_OPTIONS = /dINCFILES=${INC_DIR} /t8 /x /q + + +a all assemble: + @c:/progra~1/mplab/mpasm ${ASM_OPTIONS} ${SRC_FILE} + @ls -l *err + +b burn: + @${BURN_PGM} ${GENERAL_OPT} keypad.hex + @make verify + +c clean: + @rm -f *.cod *.err *.hex *.lst *.obj *.xrf dump*.hex *~ *#* \#* *.erc + +d dump: + @${BURN_PGM} ${GENERAL_OPT} ${DUMP_OPT} dump_keypad.hex + +e erase: + @${BURN_PGM} ${GENERAL_OPT} ${ERASE_OPT} + +r release: + @- mkdir ${RELEASE_DIR} + @- co -l ${RELEASE_FILES} + @make assemble + @mv ${RELEASE_FILES} ${RELEASE_DIR} + @mv ${RELEASE_FILES1} ${RELEASE_DIR} + @cp Makefile ${RELEASE_DIR} + @cp ${SCHEMATIC_DIR}/* ${RELEASE_DIR} + @rlog ${SRC_FILE} >${RELEASE_DIR}/CHANGELOG + @make clean + +rc relclean: + @- rm -rf ${RELEASE_DIR} + @make clean + +v verify: + @${BURN_PGM} ${GENERAL_OPT} ${VRFY_OPT} keypad.hex diff --git a/keypad-board.jpg b/keypad-board.jpg new file mode 100644 index 0000000..fe4291b --- /dev/null +++ b/keypad-board.jpg Binary files differ diff --git a/keypad-license.txt b/keypad-license.txt new file mode 100644 index 0000000..9e2992d --- /dev/null +++ b/keypad-license.txt @@ -0,0 +1,65 @@ +keypad - Copyright (c) 2002, TundraWare Inc., All Rights Reserved +$Id: keypad-license.txt,v 1.1 2002/05/05 22:28:20 tundra Exp tundra $ + +This license refers to the hardware design, schematics, software, and +all other files found in the keypad zip archive. Hereafter, these +are referred to collectively as the "keypad system". + +Permission to use and distribute the keypad system is hereby granted so +long as ALL the following conditions are met: + + 1) The user of the keypad system understands and agrees that + this is an experimental hardware/software system which is + provided "AS-IS" with no warranties expressed or implied by + TundraWare Inc. + + 2) The user acknowledges the keypad system has NOT been tested for: + a) Correct operation + b) Freedom from unintended consequences + c) Any operation or condition which might cause damage to + the user's machine, software, network, or data, or which + might cause any breach of system security of the user's + system(s) or any other systems. + + 3) By using the keypad system, the user does so at their own + risk and agrees to hold TundraWare Inc. harmless for any + damage, direct or indirect, that this system may or does cause + to the user's computational environment, including, but not + limited to, the user's hardware, software, network, or data. + The user further agrees to hold TundraWare Inc. harmless for + any economic damage or any other adverse consequence, direct + or indirect, caused by the use of the keypad system. + + 4) Any distributed copies of the keypad system must include all + the contents originally provided in this keypad system + distribution unmodified in any way. + + 5) Distribution of modified systems based on the keypad system, + hereafter called "derivative work", is permitted so long as: + + a) The derivative work is packaged separately from the + keypad system provided by TundraWare Inc. + + b) The distribution of the derivative work also includes + the original, unmodified TundraWare Inc. keypad + system release distribution upon which the derivative + work is based. + + b) The derivative work clearly notes the fact that it + derives in part from the original keypad system. + + 6) If duplicated and/or distributed, no fee beyond reasonable + duplication charges may be charged for the keypad system. + + 7) This license is provided only for NON-COMMERCIAL use of the + keypad system. Under no circumstance may the keypad + system or derivative work based upon the keypad system be + used commercially (for pay or remuneration of any kind) + without separate licensing for such use by TundraWare Inc. + + +If you do not understand, or cannot abide by any of these conditions, +DO NOT USE the keypad system. + +To report bugs or suggest improvements, contact: tundra@tundraware.com + diff --git a/keypad.asm b/keypad.asm new file mode 100644 index 0000000..f33ca0f --- /dev/null +++ b/keypad.asm @@ -0,0 +1,558 @@ +;;; KEYPAD.ASM +;;; Copyright (c) 2002, TundraWare Inc., All Rights Reserved +;;; +;;; Program to encode keypad presses into binary numbers +;;; +;;; $Id: keypad.asm,v 1.34 2002/06/18 16:44:33 tundra Exp tundra $ + + +;;;;;;;;;; +;;; This code assumes the following keypad wiring to PORTB on the PIC: +;;; +;;; RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 +;;; Col. Col. Col. Col. Row Row Row Row +;;; 4 3 2 1 4 3 2 1 +;;;;;;;;;; + + list p=16F84A + include + + errorlevel -302 ;suppress bank selection messages + __config 3ff3h ;RC osc, WDT off + __idlocs 1234 + +;;;;;;;;;; +;;; Device Constants +;;;;;;;;;; + +tmr2 equ 00H ; TMR0 prescaler constants +tmr4 equ 01H +tmr8 equ 02H +tmr16 equ 03H +tmr32 equ 04H +tmr64 equ 05H +tmr128 equ 06H +tmr256 equ 07H + + +;;;;;;;;;; +;;; Circuit Constants +;;;;;;;;;; + +KEYPAD equ PORTB +OUTPUT equ PORTA +PAR_SEL equ 4 ; bit used to select parallel/serial output +PLATCH equ 4 ; parallel latch bit +SCLK equ 1 ; serial clock out bit +SDAT equ 0 ; serial data out bit +SLATCH equ 2 ; serial latch bit +TRISKEY equ TRISB +TRISOUT equ TRISA + +; Constants used to Set TMR0 interrupt rate. +; Adjust as needed using the following formula: +; +; I = T * TMR0_CNT * Prescaler Factor +; +; TMR0_PRIME is the value actually used to prime +; TMR0 when restarting it - it counts *up* and +; interrupts on overflow. +; +; The following TMR0 constants are approximately: +; +; (T) Internal Clock Interval: 3us +; (I) TMR0 Interrupt Rate: 480us + + +TMR0_CNT equ D'5' +TMR0_PRE equ tmr32 +TMR0_PRIME equ D'256'-TMR0_CNT + + +;;;;;;;;;; +;;; Program Contants +;;;;;;;;;; + +DEBOUNCE_COUNT equ 05h ; # times keyhit must be unchanged to be valid +DEBOUNCE_TIME equ 0ah ; # TMR0 interrupts to wait between keyboard reads +CLK_TIME equ 01h ; # TMR0 interrupts for serial clock true +MAX_COL equ 04h ; # of columns on the keyboard +NO_HIT equ 0fh ; bit pattern which means no key has been hit +LATCH_TIME equ 01h ; # TMR0 interrupts to leave latch line true +REPEAT_COUNT equ 03h ; scan delay = + ; REPEAT_COUNT * REPEAT_DELAY * TMR0 rate +REPEAT_DELAY equ D'87' + +;;;;;;;;;; +;;; Register File Assignments +;;;;;;;;;; + + CBLOCK 0cH + ; context save area + + _fsr + _pclath + _status + _w + + ; flags + + par_out ; non-zero -> parallel out; zero -> serial out + + ; variables + + count + current_col + key_val + wait_count + ENDC + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;; +;;; Power-On Entry Point +;;;;;;;;;; + + org 00H + goto main + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;; +;;; Interrupt Handler +;;;;;;;;;; + + org 04H + + movwf _w ; save context + movfw STATUS + bcf STATUS,RP1 + bcf STATUS,RP0 + movwf _status + movfw FSR + movwf _fsr + movfw PCLATH + movwf _pclath + clrf PCLATH + + ; Figure out who interrupted and service it + + btfsc INTCON,T0IF ; did we get a TMR0 interrupt? + goto tmr0_svc ; yup + goto restore_context ; no supported interrupt type found + + ; TMR0 ISR +tmr0_svc: + bcf INTCON,T0IF ; clear the interrupt condition + movlw TMR0_PRIME ; prime the counter + movwf TMR0 + + ; Update the wait timer if it is in use + ; Only do this on TMR0 interrupts so timing is predictable + + movfw wait_count + btfss STATUS,Z ; non-zero count means 'in use' + decf wait_count,F ; decrement current count + + ;;; End TMR0 ISR + +restore_context: + movfw _pclath ; restore entry context + movwf PCLATH + movfw _fsr + movwf FSR + movfw _status + movwf STATUS + swapf _w,F ; get W back w/o changing Z flag + swapf _w,W + + retfie ; all done + +;;; End of interrupt handler + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;; +;;; Main program logic +;;;;;;;;;; + +main: + call init ; initialize the system +scan: + incf current_col,F ; pickup next column to scan + movlw MAX_COL+1 ; if current_col > MAX_COL then + subwf current_col,W ; we just did last column, so start over + btfss STATUS,Z ; zero means we need to start over + goto key_scan ; nope, go look for key hits + clrf current_col ; yes, reinit column counter + goto scan +key_scan: + movfw current_col ; get bit pattern which + call col_select ; selects curently desired column + movwf KEYPAD ; and enable that column + movfw KEYPAD ; get keypad inputs + andlw 0fh ; only want row bits + addlw -NO_HIT ; see if key hit occured + btfsc STATUS,Z ; in current column + goto scan ; no, look at next column + call key_get ; yes, process ignore key releaseskeystroke + andlw 0fh ; there is bounce on a key *release* + addlw -NO_HIT ; as well as a key *press* + btfsc STATUS,Z ; we want to debounce key releases + goto scan ; (so they do not look like legit keystrokes) + ; but then we just ignore the release + call key_xlate ; legit keystroke - turn into binary value + call key_out ; and output it + + ; introduce wait between keyboard scans to limit + ; key repeat rate + + movlw REPEAT_COUNT + movwf count +scan_delay: + movlw REPEAT_DELAY + call wait + decfsz count,F + goto scan_delay + + goto scan ; scan forever + +;;; End of main logic + + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + ;;;;;;;;;; + ;;; Data & Tables + ;;;;;;;;;; + +;;;;;;;;;; +;;; Embedded Release & Copyright Information +;;;;;;;;;; + + DA "keypad.asm - $Revision: 1.34 $ - Copyright 2002, TundraWare Inc., All Rights Reserved." + +; End of Embedded Release & Copyright Information + + +;;;;;;;;;; +;;; Column selection bit patterns. +;;;;;;;;;; + +col_select: + addwf PCL,F + DT b'11110000' ; placeholder, no column selected + DT b'11100000' ; column 1 selected + DT b'11010000' ; column 2 selected + DT b'10110000' ; column 3 selected + DT b'01110000' ; column 4 selected + +;;;;;;;;;; +;;; Translate row/column selection pattern into equivalent binary value. +;;; There is one subtable for each column. '*' is translated of 0eh and +;;; '#' is translated to 0fh. This allows the entire keyboard to be +;;; uniquely translated to 1 of 16 hex output values. +;;;;;;;;;; + +col1_keys: + addwf PCL,F + DT 01h ; Row 1 + DT 04h ; Row 2 + DT 07h ; Row 3 + DT 0eh ; Row 4 +col2_keys: + addwf PCL,F + DT 02h ; Row 1 + DT 05h ; Row 2 + DT 08h ; Row 3 + DT 00h ; Row 4 +col3_keys: + addwf PCL,F + DT 03h ; Row 1 + DT 06h ; Row 2 + DT 09h ; Row 3 + DT 0fh ; Row 4 +col4_keys: + addwf PCL,F + DT 0ah ; Row 1 + DT 0b ; Row 2 + DT 0c ; Row 3 + DT 0dh ; Row 4 + + +;;;;;;;;;; +;;; Translate a nibble bit pattern where an on bit means that row was selected +;;; into an equivalent binary value for that row. +;;;;;;;;;; + +bit2row: + addwf PCL,F + DT 00H ; placeholder, never used + DT 00H ; b'0001' => row 1 + DT 01H ; b'0010' => row 2 + DT 00H ; placeholder, never used + DT 02H ; b'0100' => row 3 + DT 00H ; placeholder, never used + DT 00H ; placeholder, never used + DT 00H ; placeholder, never used + DT 03H ; b'1000' => row 4 + + +;;; End of translation tables + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;; +;;; Supporting Subroutines +;;;;;;;;;; + + +;;;;;;;;;; +;;; Output current keystroke. +;;; This routine supports both serial and parallel output modes, +;;; which are selected at init time as follows: +;;; +;;; A4=0 ===> Serial Output +;;; A4=1 ===> Parallel Output +;;;;;;;;;; + +key_out: + + movlw 0 ; clear W + addwf par_out,W ; if 0, we want serial output + btfsc STATUS,Z + goto serial_out + + ; parallel output routine + + movfw key_val ; load the value + movwf OUTPUT + bsf OUTPUT,PLATCH ; latch on + movlw LATCH_TIME + call wait + bcf OUTPUT,PLATCH ; latch off + return + + ; serial output routine +serial_out: + movlw 04h ; we have to shift out 4 bits LSB->MSB + movwf count +shift_bit: + bcf OUTPUT,SDAT ; assume it's a 0 + btfss key_val,0 ; see what it really is + goto clock_bit + bsf OUTPUT,SDAT ; nope, it was a 1 +clock_bit: + bsf OUTPUT,SCLK ; clock it out + movlw CLK_TIME + call wait + bcf OUTPUT,SCLK ; reset clock bit + decf count,F ; see if bits left to do + btfsc STATUS,Z + goto serial_latch ; all done + rrf key_val,F ; pickup next bit + goto shift_bit ; and move it + + ; now latch the data out +serial_latch: + bsf OUTPUT,SLATCH ; latch on + movlw LATCH_TIME + call wait + bcf OUTPUT,SLATCH ; latch off + return + +;;; End of 'key_out' + + +;;;;;;;;;; +;;; Read a debounced key from the keyboard. +;;; Keep reading keyboard until the value has not changed +;;; DEBOUNCE_COUNT times. Wait an interval of DEBOUNCE_TIME +;;; between read attempts +;;;;;;;;;; + +key_get: + movfw KEYPAD + movwf key_val +debounce: + movlw DEBOUNCE_COUNT ; setup debounce counter + movwf count +check_key: + movlw DEBOUNCE_TIME ; wait to let keyboard settle + call wait + movfw KEYPAD + subwf key_val,F ; see if matched last + btfsc STATUS,Z ; if Z, the values matched + goto matched + movwf key_val ; no match, start debounce cycle again + goto debounce +matched: + movwf key_val ; save in case we have to do again + decfsz count,F ; see how many times left to go + goto check_key ; more matches to do + + return ; got DEBOUNCE_COUNT matches - all done + +; End of 'key_get' + + +;;;;;;;;;; +;;; Translate the current keystroke into an equivalent binary value. +;;;;;;;;;; + +key_xlate: + ; translate the hardware bit pattern indicating + ; which row was selected into an equivalent binary + ; row number. This will be used to index into + ; the translation table for the current column to + ; get the final binary value for that key. + + comf key_val,W ; complement so only bit on corresponds + andlw 0fh ; to row selected - mask unused off + call bit2row ; translate it into a row number + movwf key_val ; save for use below + + ; translate key value into equivalent binary value + ; using the appropriate translation table for the + ; current column + + movfw current_col ; get current column + addlw -1 ; convert into an 0-relative offset + addwf PCL,F ; dispatch into the following jump table + goto col1_xlate + goto col2_xlate + goto col3_xlate + goto col4_xlate + +col1_xlate: + movfw key_val + call col1_keys + movwf key_val + return + +col2_xlate: + movfw key_val + call col2_keys + movwf key_val + return + +col3_xlate: + movfw key_val + call col3_keys + movwf key_val + return + +col4_xlate: + movfw key_val + call col4_keys + movwf key_val + return + + +;;; End of 'key_xlate' + + +;;;;;;;;;; +;;; Generic wait routine. +;;; Expects wait count to be passed in W. +;;; Total wait time is thus W * TMR0 interrupt rate +;;;;;;;;;; + +wait: + movwf wait_count +waiting: + movfw wait_count ; wait until we countdown to 0 + btfss STATUS,Z + goto waiting + return + +;;; End Of 'wait' + + +;;;;;;;;;; +;;; Initialize hardware and software at startup as needed. +;;; Returns with register bank 0 selected. +;;;;;;;;;; + +init: + clrf INTCON ; all interrupts off, flags cleared + + ; determine whether we want serial or parallel output + ; and set flag accordingly for use later in the output routine + + clrf par_out ; assume serial + btfsc OUTPUT,PAR_SEL ; if high - parallel out + comf par_out,F ; we want parallel output + + ; Setup control registers + + bsf STATUS,RP0 ; select register bank 1 + + ; setup output port with all bits output enabled + + movlw b'11100000' ; set OUTPUT 0:4 as outputs + movwf TRISOUT ; (to output binary value of keypress) + + ; Setup control registers + + bsf STATUS,RP0 ; select register bank 1 + + ; setup keypad interface port + + movlw b'00001111' ; KEYPAD high nibble set for output + ; (for column control) + movwf TRISKEY ; KEYPAD low nibble set for input + ; (to read rows) + + ; setup TMR0 interrupt interval + + clrf OPTION_REG ; TMR0: assign int. clock & prescaler + ; PORTB: weak pullups + movlw TMR0_PRE ; Set TMR0 prescale factor + iorwf OPTION_REG,F + + bcf STATUS,RP0 ; select register bank 0 + + ; Prime the TMR0 countup counter + + movlw TMR0_PRIME ; prime the counter + movwf TMR0 + + ; Intialize ports + + clrf OUTPUT + clrf KEYPAD + + ; Initialize variables + + clrf current_col + clrf key_val + clrf count + clrf wait_count + + ; Setup interrupt handling + + bsf INTCON,T0IE ; enable TMR0 interrupt + bsf INTCON,GIE ; and turn interrupts back on + + return + +;;; End of 'init' + + +;;;;;;;;;; +;;; EEPROM Contents +;;;;;;;;;; + + org 2100h + + DE "" + END + diff --git a/keypad.brd b/keypad.brd new file mode 100644 index 0000000..aaa0d15 --- /dev/null +++ b/keypad.brd Binary files differ diff --git a/keypad.gif b/keypad.gif new file mode 100644 index 0000000..da36777 --- /dev/null +++ b/keypad.gif Binary files differ diff --git a/keypad.hex b/keypad.hex new file mode 100644 index 0000000..6707c0d --- /dev/null +++ b/keypad.hex @@ -0,0 +1,36 @@ +:020000040000FA +:020000002028B6 +:080008008F00030803138312AB +:100010008E0004088C000A088D008A010B19112833 +:1000200017280B11FB3081001408031D94030D08E1 +:100030008A000C0884000E0883008F0E0F0E090042 +:10004000DC20920A05301202031D28289201212883 +:1000500012086920860006080F39F13E031921288D +:10006000AC200F39F13E03192128BC208D2003302C +:1000700091005730D720910B39282128E535F03CE5 +:10008000E4306117ED392D1024106529693BE939F9 +:10009000EE37201DAE18B41924102D104310F03780 +:1000A000F23CE7347434321030182C195410EE3A04 +:1000B0007232D730F230A032EE24AE312016EC206E +:1000C00020366929E833733A5210F332F232653B35 +:1000D0002E328207F034E034D034B03470348207EA +:1000E0000134043407340E348207023405340834F2 +:1000F000003482070334063409340F3482070A348B +:100100000B340C340D3482070034003401340034D5 +:100110000234003400340034033400301007031973 +:1001200098281308850005160130D720051208000D +:10013000043091000510131C9E280514851401300D +:10014000D720851091030319A728930C9A28051529 +:100150000130D720051108000608930005309100F2 +:100160000A30D720060893020319B8289300AE2856 +:100170009300910BB028080013090F3983209300D6 +:100180001208FF3E8207C728CB28CF28D3281308A0 +:100190006F209300080013087420930008001308D0 +:1001A00079209300080013087E2093000800940033 +:1001B0001408031DD82808008B019001051A900926 +:1001C0008316E030850083160F30860081010430ED +:1001D00081048312FB308100850186019201930125 +:0A01E000910194018B168B170800A3 +:084000000100020003000400AE +:02400E00F33F7E +:00000001FF diff --git a/keypad.lst b/keypad.lst new file mode 100644 index 0000000..6f4d8e5 --- /dev/null +++ b/keypad.lst @@ -0,0 +1,806 @@ +MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 1 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + + 00001 ;;; KEYPAD.ASM + 00002 ;;; Copyright (c) 2002, TundraWare Inc., All Rights Reserved + 00003 ;;; + 00004 ;;; Program to encode keypad presses into binary numbers + 00005 ;;; + 00006 ;;; $Id: keypad.asm,v 1.34 2002/06/18 16:44:33 tundra Exp tundra $ + 00007 + 00008 + 00009 ;;;;;;;;;; + 00010 ;;; This code assumes the following keypad wiring to PORTB on the PIC: + 00011 ;;; + 00012 ;;; RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 + 00013 ;;; Col. Col. Col. Col. Row Row Row Row + 00014 ;;; 4 3 2 1 4 3 2 1 + 00015 ;;;;;;;;;; + 00016 + 00017 list p=16F84A + 00018 include + 00001 LIST + 00002 ; P16F84A.INC Standard Header File, Version 2.00 Microchip Technology, Inc. + 00134 LIST + 00019 + 00020 errorlevel -302 ;suppress bank selection messages +2007 3FF3 00021 __config 3ff3h ;RC osc, WDT off +2000 0001 0002 0003 00022 __idlocs 1234 + 0004 + 00023 + 00024 ;;;;;;;;;; + 00025 ;;; Device Constants + 00026 ;;;;;;;;;; + 00027 + 00000000 00028 tmr2 equ 00H ; TMR0 prescaler constants + 00000001 00029 tmr4 equ 01H + 00000002 00030 tmr8 equ 02H + 00000003 00031 tmr16 equ 03H + 00000004 00032 tmr32 equ 04H + 00000005 00033 tmr64 equ 05H + 00000006 00034 tmr128 equ 06H + 00000007 00035 tmr256 equ 07H + 00036 + 00037 + 00038 ;;;;;;;;;; + 00039 ;;; Circuit Constants + 00040 ;;;;;;;;;; + 00041 + 00000006 00042 KEYPAD equ PORTB + 00000005 00043 OUTPUT equ PORTA + 00000004 00044 PAR_SEL equ 4 ; bit used to select parallel/serial output + 00000004 00045 PLATCH equ 4 ; parallel latch bit + 00000001 00046 SCLK equ 1 ; serial clock out bit + 00000000 00047 SDAT equ 0 ; serial data out bit + 00000002 00048 SLATCH equ 2 ; serial latch bit + 00000086 00049 TRISKEY equ TRISB + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 2 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + + 00000085 00050 TRISOUT equ TRISA + 00051 + 00052 ; Constants used to Set TMR0 interrupt rate. + 00053 ; Adjust as needed using the following formula: + 00054 ; + 00055 ; I = T * TMR0_CNT * Prescaler Factor + 00056 ; + 00057 ; TMR0_PRIME is the value actually used to prime + 00058 ; TMR0 when restarting it - it counts *up* and + 00059 ; interrupts on overflow. + 00060 ; + 00061 ; The following TMR0 constants are approximately: + 00062 ; + 00063 ; (T) Internal Clock Interval: 3us + 00064 ; (I) TMR0 Interrupt Rate: 480us + 00065 + 00066 + 00000005 00067 TMR0_CNT equ D'5' + 00000004 00068 TMR0_PRE equ tmr32 + 000000FB 00069 TMR0_PRIME equ D'256'-TMR0_CNT + 00070 + 00071 + 00072 ;;;;;;;;;; + 00073 ;;; Program Contants + 00074 ;;;;;;;;;; + 00075 + 00000005 00076 DEBOUNCE_COUNT equ 05h ; # times keyhit must be unchanged to be valid + 0000000A 00077 DEBOUNCE_TIME equ 0ah ; # TMR0 interrupts to wait between keyboard reads + 00000001 00078 CLK_TIME equ 01h ; # TMR0 interrupts for serial clock true + 00000004 00079 MAX_COL equ 04h ; # of columns on the keyboard + 0000000F 00080 NO_HIT equ 0fh ; bit pattern which means no key has been hit + 00000001 00081 LATCH_TIME equ 01h ; # TMR0 interrupts to leave latch line true + 00000003 00082 REPEAT_COUNT equ 03h ; scan delay = + 00083 ; REPEAT_COUNT * REPEAT_DELAY * TMR0 rate + 00000057 00084 REPEAT_DELAY equ D'87' + 00085 + 00086 ;;;;;;;;;; + 00087 ;;; Register File Assignments + 00088 ;;;;;;;;;; + 00089 + 00090 CBLOCK 0cH + 00091 ; context save area + 00092 + 0000000C 00093 _fsr + 0000000D 00094 _pclath + 0000000E 00095 _status + 0000000F 00096 _w + 00097 + 00098 ; flags + 00099 + 00000010 00100 par_out ; non-zero -> parallel out; zero -> serial out + 00101 + 00102 ; variables + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 3 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + + 00103 + 00000011 00104 count + 00000012 00105 current_col + 00000013 00106 key_val + 00000014 00107 wait_count + 00108 ENDC + 00109 + 00110 + 00111 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 00112 + 00113 + 00114 ;;;;;;;;;; + 00115 ;;; Power-On Entry Point + 00116 ;;;;;;;;;; + 00117 +0000 00118 org 00H +0000 2820 00119 goto main + 00120 + 00121 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 00122 + 00123 ;;;;;;;;;; + 00124 ;;; Interrupt Handler + 00125 ;;;;;;;;;; + 00126 +0004 00127 org 04H + 00128 +0004 008F 00129 movwf _w ; save context +0005 0803 00130 movfw STATUS +0006 1303 00131 bcf STATUS,RP1 +0007 1283 00132 bcf STATUS,RP0 +0008 008E 00133 movwf _status +0009 0804 00134 movfw FSR +000A 008C 00135 movwf _fsr +000B 080A 00136 movfw PCLATH +000C 008D 00137 movwf _pclath +000D 018A 00138 clrf PCLATH + 00139 + 00140 ; Figure out who interrupted and service it + 00141 +000E 190B 00142 btfsc INTCON,T0IF ; did we get a TMR0 interrupt? +000F 2811 00143 goto tmr0_svc ; yup +0010 2817 00144 goto restore_context ; no supported interrupt type found + 00145 + 00146 ; TMR0 ISR +0011 00147 tmr0_svc: +0011 110B 00148 bcf INTCON,T0IF ; clear the interrupt condition +0012 30FB 00149 movlw TMR0_PRIME ; prime the counter +0013 0081 00150 movwf TMR0 + 00151 + 00152 ; Update the wait timer if it is in use + 00153 ; Only do this on TMR0 interrupts so timing is predictable + 00154 +0014 0814 00155 movfw wait_count + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 4 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + +0015 1D03 00156 btfss STATUS,Z ; non-zero count means 'in use' +0016 0394 00157 decf wait_count,F ; decrement current count + 00158 + 00159 ;;; End TMR0 ISR + 00160 +0017 00161 restore_context: +0017 080D 00162 movfw _pclath ; restore entry context +0018 008A 00163 movwf PCLATH +0019 080C 00164 movfw _fsr +001A 0084 00165 movwf FSR +001B 080E 00166 movfw _status +001C 0083 00167 movwf STATUS +001D 0E8F 00168 swapf _w,F ; get W back w/o changing Z flag +001E 0E0F 00169 swapf _w,W + 00170 +001F 0009 00171 retfie ; all done + 00172 + 00173 ;;; End of interrupt handler + 00174 + 00175 + 00176 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 00177 + 00178 + 00179 ;;;;;;;;;; + 00180 ;;; Main program logic + 00181 ;;;;;;;;;; + 00182 +0020 00183 main: +0020 20DC 00184 call init ; initialize the system +0021 00185 scan: +0021 0A92 00186 incf current_col,F ; pickup next column to scan +0022 3005 00187 movlw MAX_COL+1 ; if current_col > MAX_COL then +0023 0212 00188 subwf current_col,W ; we just did last column, so start over +0024 1D03 00189 btfss STATUS,Z ; zero means we need to start over +0025 2828 00190 goto key_scan ; nope, go look for key hits +0026 0192 00191 clrf current_col ; yes, reinit column counter +0027 2821 00192 goto scan +0028 00193 key_scan: +0028 0812 00194 movfw current_col ; get bit pattern which +0029 2069 00195 call col_select ; selects curently desired column +002A 0086 00196 movwf KEYPAD ; and enable that column +002B 0806 00197 movfw KEYPAD ; get keypad inputs +002C 390F 00198 andlw 0fh ; only want row bits +002D 3EF1 00199 addlw -NO_HIT ; see if key hit occured +002E 1903 00200 btfsc STATUS,Z ; in current column +002F 2821 00201 goto scan ; no, look at next column +0030 20AC 00202 call key_get ; yes, process ignore key releaseskeystroke +0031 390F 00203 andlw 0fh ; there is bounce on a key *release* +0032 3EF1 00204 addlw -NO_HIT ; as well as a key *press* +0033 1903 00205 btfsc STATUS,Z ; we want to debounce key releases +0034 2821 00206 goto scan ; (so they do not look like legit keystrokes) + 00207 ; but then we just ignore the release +0035 20BC 00208 call key_xlate ; legit keystroke - turn into binary value + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 5 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + +0036 208D 00209 call key_out ; and output it + 00210 + 00211 ; introduce wait between keyboard scans to limit + 00212 ; key repeat rate + 00213 +0037 3003 00214 movlw REPEAT_COUNT +0038 0091 00215 movwf count +0039 00216 scan_delay: +0039 3057 00217 movlw REPEAT_DELAY +003A 20D7 00218 call wait +003B 0B91 00219 decfsz count,F +003C 2839 00220 goto scan_delay + 00221 +003D 2821 00222 goto scan ; scan forever + 00223 + 00224 ;;; End of main logic + 00225 + 00226 + 00227 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 00228 + 00229 + 00230 ;;;;;;;;;; + 00231 ;;; Data & Tables + 00232 ;;;;;;;;;; + 00233 + 00234 ;;;;;;;;;; + 00235 ;;; Embedded Release & Copyright Information + 00236 ;;;;;;;;;; + 00237 +003E 35E5 3CF0 30E4 00238 DA "keypad.asm - $Revision: 1.34 $ - Copyright 2002, TundraWare Inc., All Rights Re + served." + 1761 39ED 102D + 1024 2965 3B69 + 39E9 37EE 1D20 + 18AE 19B4 1024 + 102D 1043 37F0 + 3CF2 34E7 3474 + 1032 1830 192C + 1054 3AEE 3272 + 30D7 30F2 32A0 + 24EE 31AE 1620 + 20EC 3620 2969 + 33E8 3A73 1052 + 32F3 32F2 3B65 + 322E + 00239 + 00240 ; End of Embedded Release & Copyright Information + 00241 + 00242 + 00243 ;;;;;;;;;; + 00244 ;;; Column selection bit patterns. + 00245 ;;;;;;;;;; + 00246 + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 6 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + +0069 00247 col_select: +0069 0782 00248 addwf PCL,F +006A 34F0 00249 DT b'11110000' ; placeholder, no column selected +006B 34E0 00250 DT b'11100000' ; column 1 selected +006C 34D0 00251 DT b'11010000' ; column 2 selected +006D 34B0 00252 DT b'10110000' ; column 3 selected +006E 3470 00253 DT b'01110000' ; column 4 selected + 00254 + 00255 ;;;;;;;;;; + 00256 ;;; Translate row/column selection pattern into equivalent binary value. + 00257 ;;; There is one subtable for each column. '*' is translated of 0eh and + 00258 ;;; '#' is translated to 0fh. This allows the entire keyboard to be + 00259 ;;; uniquely translated to 1 of 16 hex output values. + 00260 ;;;;;;;;;; + 00261 +006F 00262 col1_keys: +006F 0782 00263 addwf PCL,F +0070 3401 00264 DT 01h ; Row 1 +0071 3404 00265 DT 04h ; Row 2 +0072 3407 00266 DT 07h ; Row 3 +0073 340E 00267 DT 0eh ; Row 4 +0074 00268 col2_keys: +0074 0782 00269 addwf PCL,F +0075 3402 00270 DT 02h ; Row 1 +0076 3405 00271 DT 05h ; Row 2 +0077 3408 00272 DT 08h ; Row 3 +0078 3400 00273 DT 00h ; Row 4 +0079 00274 col3_keys: +0079 0782 00275 addwf PCL,F +007A 3403 00276 DT 03h ; Row 1 +007B 3406 00277 DT 06h ; Row 2 +007C 3409 00278 DT 09h ; Row 3 +007D 340F 00279 DT 0fh ; Row 4 +007E 00280 col4_keys: +007E 0782 00281 addwf PCL,F +007F 340A 00282 DT 0ah ; Row 1 +0080 340B 00283 DT 0b ; Row 2 +0081 340C 00284 DT 0c ; Row 3 +0082 340D 00285 DT 0dh ; Row 4 + 00286 + 00287 + 00288 ;;;;;;;;;; + 00289 ;;; Translate a nibble bit pattern where an on bit means that row was selected + 00290 ;;; into an equivalent binary value for that row. + 00291 ;;;;;;;;;; + 00292 +0083 00293 bit2row: +0083 0782 00294 addwf PCL,F +0084 3400 00295 DT 00H ; placeholder, never used +0085 3400 00296 DT 00H ; b'0001' => row 1 +0086 3401 00297 DT 01H ; b'0010' => row 2 +0087 3400 00298 DT 00H ; placeholder, never used +0088 3402 00299 DT 02H ; b'0100' => row 3 + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 7 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + +0089 3400 00300 DT 00H ; placeholder, never used +008A 3400 00301 DT 00H ; placeholder, never used +008B 3400 00302 DT 00H ; placeholder, never used +008C 3403 00303 DT 03H ; b'1000' => row 4 + 00304 + 00305 + 00306 ;;; End of translation tables + 00307 + 00308 + 00309 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + 00310 + 00311 + 00312 ;;;;;;;;;; + 00313 ;;; Supporting Subroutines + 00314 ;;;;;;;;;; + 00315 + 00316 + 00317 ;;;;;;;;;; + 00318 ;;; Output current keystroke. + 00319 ;;; This routine supports both serial and parallel output modes, + 00320 ;;; which are selected at init time as follows: + 00321 ;;; + 00322 ;;; A4=0 ===> Serial Output + 00323 ;;; A4=1 ===> Parallel Output + 00324 ;;;;;;;;;; + 00325 +008D 00326 key_out: + 00327 +008D 3000 00328 movlw 0 ; clear W +008E 0710 00329 addwf par_out,W ; if 0, we want serial output +008F 1903 00330 btfsc STATUS,Z +0090 2898 00331 goto serial_out + 00332 + 00333 ; parallel output routine + 00334 +0091 0813 00335 movfw key_val ; load the value +0092 0085 00336 movwf OUTPUT +0093 1605 00337 bsf OUTPUT,PLATCH ; latch on +0094 3001 00338 movlw LATCH_TIME +0095 20D7 00339 call wait +0096 1205 00340 bcf OUTPUT,PLATCH ; latch off +0097 0008 00341 return + 00342 + 00343 ; serial output routine +0098 00344 serial_out: +0098 3004 00345 movlw 04h ; we have to shift out 4 bits LSB->MSB +0099 0091 00346 movwf count +009A 00347 shift_bit: +009A 1005 00348 bcf OUTPUT,SDAT ; assume it's a 0 +009B 1C13 00349 btfss key_val,0 ; see what it really is +009C 289E 00350 goto clock_bit +009D 1405 00351 bsf OUTPUT,SDAT ; nope, it was a 1 +009E 00352 clock_bit: + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 8 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + +009E 1485 00353 bsf OUTPUT,SCLK ; clock it out +009F 3001 00354 movlw CLK_TIME +00A0 20D7 00355 call wait +00A1 1085 00356 bcf OUTPUT,SCLK ; reset clock bit +00A2 0391 00357 decf count,F ; see if bits left to do +00A3 1903 00358 btfsc STATUS,Z +00A4 28A7 00359 goto serial_latch ; all done +00A5 0C93 00360 rrf key_val,F ; pickup next bit +00A6 289A 00361 goto shift_bit ; and move it + 00362 + 00363 ; now latch the data out +00A7 00364 serial_latch: +00A7 1505 00365 bsf OUTPUT,SLATCH ; latch on +00A8 3001 00366 movlw LATCH_TIME +00A9 20D7 00367 call wait +00AA 1105 00368 bcf OUTPUT,SLATCH ; latch off +00AB 0008 00369 return + 00370 + 00371 ;;; End of 'key_out' + 00372 + 00373 + 00374 ;;;;;;;;;; + 00375 ;;; Read a debounced key from the keyboard. + 00376 ;;; Keep reading keyboard until the value has not changed + 00377 ;;; DEBOUNCE_COUNT times. Wait an interval of DEBOUNCE_TIME + 00378 ;;; between read attempts + 00379 ;;;;;;;;;; + 00380 +00AC 00381 key_get: +00AC 0806 00382 movfw KEYPAD +00AD 0093 00383 movwf key_val +00AE 00384 debounce: +00AE 3005 00385 movlw DEBOUNCE_COUNT ; setup debounce counter +00AF 0091 00386 movwf count +00B0 00387 check_key: +00B0 300A 00388 movlw DEBOUNCE_TIME ; wait to let keyboard settle +00B1 20D7 00389 call wait +00B2 0806 00390 movfw KEYPAD +00B3 0293 00391 subwf key_val,F ; see if matched last +00B4 1903 00392 btfsc STATUS,Z ; if Z, the values matched +00B5 28B8 00393 goto matched +00B6 0093 00394 movwf key_val ; no match, start debounce cycle again +00B7 28AE 00395 goto debounce +00B8 00396 matched: +00B8 0093 00397 movwf key_val ; save in case we have to do again +00B9 0B91 00398 decfsz count,F ; see how many times left to go +00BA 28B0 00399 goto check_key ; more matches to do + 00400 +00BB 0008 00401 return ; got DEBOUNCE_COUNT matches - all done + 00402 + 00403 ; End of 'key_get' + 00404 + 00405 + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 9 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + + 00406 ;;;;;;;;;; + 00407 ;;; Translate the current keystroke into an equivalent binary value. + 00408 ;;;;;;;;;; + 00409 +00BC 00410 key_xlate: + 00411 ; translate the hardware bit pattern indicating + 00412 ; which row was selected into an equivalent binary + 00413 ; row number. This will be used to index into + 00414 ; the translation table for the current column to + 00415 ; get the final binary value for that key. + 00416 +00BC 0913 00417 comf key_val,W ; complement so only bit on corresponds +00BD 390F 00418 andlw 0fh ; to row selected - mask unused off +00BE 2083 00419 call bit2row ; translate it into a row number +00BF 0093 00420 movwf key_val ; save for use below + 00421 + 00422 ; translate key value into equivalent binary value + 00423 ; using the appropriate translation table for the + 00424 ; current column + 00425 +00C0 0812 00426 movfw current_col ; get current column +00C1 3EFF 00427 addlw -1 ; convert into an 0-relative offset +00C2 0782 00428 addwf PCL,F ; dispatch into the following jump table +00C3 28C7 00429 goto col1_xlate +00C4 28CB 00430 goto col2_xlate +00C5 28CF 00431 goto col3_xlate +00C6 28D3 00432 goto col4_xlate + 00433 +00C7 00434 col1_xlate: +00C7 0813 00435 movfw key_val +00C8 206F 00436 call col1_keys +00C9 0093 00437 movwf key_val +00CA 0008 00438 return + 00439 +00CB 00440 col2_xlate: +00CB 0813 00441 movfw key_val +00CC 2074 00442 call col2_keys +00CD 0093 00443 movwf key_val +00CE 0008 00444 return + 00445 +00CF 00446 col3_xlate: +00CF 0813 00447 movfw key_val +00D0 2079 00448 call col3_keys +00D1 0093 00449 movwf key_val +00D2 0008 00450 return + 00451 +00D3 00452 col4_xlate: +00D3 0813 00453 movfw key_val +00D4 207E 00454 call col4_keys +00D5 0093 00455 movwf key_val +00D6 0008 00456 return + 00457 + 00458 + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 10 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + + 00459 ;;; End of 'key_xlate' + 00460 + 00461 + 00462 ;;;;;;;;;; + 00463 ;;; Generic wait routine. + 00464 ;;; Expects wait count to be passed in W. + 00465 ;;; Total wait time is thus W * TMR0 interrupt rate + 00466 ;;;;;;;;;; + 00467 +00D7 00468 wait: +00D7 0094 00469 movwf wait_count +00D8 00470 waiting: +00D8 0814 00471 movfw wait_count ; wait until we countdown to 0 +00D9 1D03 00472 btfss STATUS,Z +00DA 28D8 00473 goto waiting +00DB 0008 00474 return + 00475 + 00476 ;;; End Of 'wait' + 00477 + 00478 + 00479 ;;;;;;;;;; + 00480 ;;; Initialize hardware and software at startup as needed. + 00481 ;;; Returns with register bank 0 selected. + 00482 ;;;;;;;;;; + 00483 +00DC 00484 init: +00DC 018B 00485 clrf INTCON ; all interrupts off, flags cleared + 00486 + 00487 ; determine whether we want serial or parallel output + 00488 ; and set flag accordingly for use later in the output routine + 00489 +00DD 0190 00490 clrf par_out ; assume serial +00DE 1A05 00491 btfsc OUTPUT,PAR_SEL ; if high - parallel out +00DF 0990 00492 comf par_out,F ; we want parallel output + 00493 + 00494 ; Setup control registers + 00495 +00E0 1683 00496 bsf STATUS,RP0 ; select register bank 1 + 00497 + 00498 ; setup output port with all bits output enabled + 00499 +00E1 30E0 00500 movlw b'11100000' ; set OUTPUT 0:4 as outputs +00E2 0085 00501 movwf TRISOUT ; (to output binary value of keypress) + 00502 + 00503 ; Setup control registers + 00504 +00E3 1683 00505 bsf STATUS,RP0 ; select register bank 1 + 00506 + 00507 ; setup keypad interface port + 00508 +00E4 300F 00509 movlw b'00001111' ; KEYPAD high nibble set for output + 00510 ; (for column control) +00E5 0086 00511 movwf TRISKEY ; KEYPAD low nibble set for input + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 11 + + +LOC OBJECT CODE LINE SOURCE TEXT + VALUE + + 00512 ; (to read rows) + 00513 + 00514 ; setup TMR0 interrupt interval + 00515 +00E6 0181 00516 clrf OPTION_REG ; TMR0: assign int. clock & prescaler + 00517 ; PORTB: weak pullups +00E7 3004 00518 movlw TMR0_PRE ; Set TMR0 prescale factor +00E8 0481 00519 iorwf OPTION_REG,F + 00520 +00E9 1283 00521 bcf STATUS,RP0 ; select register bank 0 + 00522 + 00523 ; Prime the TMR0 countup counter + 00524 +00EA 30FB 00525 movlw TMR0_PRIME ; prime the counter +00EB 0081 00526 movwf TMR0 + 00527 + 00528 ; Intialize ports + 00529 +00EC 0185 00530 clrf OUTPUT +00ED 0186 00531 clrf KEYPAD + 00532 + 00533 ; Initialize variables + 00534 +00EE 0192 00535 clrf current_col +00EF 0193 00536 clrf key_val +00F0 0191 00537 clrf count +00F1 0194 00538 clrf wait_count + 00539 + 00540 ; Setup interrupt handling + 00541 +00F2 168B 00542 bsf INTCON,T0IE ; enable TMR0 interrupt +00F3 178B 00543 bsf INTCON,GIE ; and turn interrupts back on + 00544 +00F4 0008 00545 return + 00546 + 00547 ;;; End of 'init' + 00548 + 00549 + 00550 ;;;;;;;;;; + 00551 ;;; EEPROM Contents + 00552 ;;;;;;;;;; + 00553 +2100 00554 org 2100h + 00555 +2100 00556 DE "" + 00557 END + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 12 + + +SYMBOL TABLE + LABEL VALUE + +C 00000000 +CLK_TIME 00000001 +DC 00000001 +DEBOUNCE_COUNT 00000005 +DEBOUNCE_TIME 0000000A +EEADR 00000009 +EECON1 00000088 +EECON2 00000089 +EEDATA 00000008 +EEIE 00000006 +EEIF 00000004 +F 00000001 +FSR 00000004 +GIE 00000007 +INCFILES ../include +INDF 00000000 +INTCON 0000000B +INTE 00000004 +INTEDG 00000006 +INTF 00000001 +IRP 00000007 +KEYPAD 00000006 +LATCH_TIME 00000001 +MAX_COL 00000004 +NOT_PD 00000003 +NOT_RBPU 00000007 +NOT_TO 00000004 +NO_HIT 0000000F +OPTION_REG 00000081 +OUTPUT 00000005 +PAR_SEL 00000004 +PCL 00000002 +PCLATH 0000000A +PLATCH 00000004 +PORTA 00000005 +PORTB 00000006 +PS0 00000000 +PS1 00000001 +PS2 00000002 +PSA 00000003 +RBIE 00000003 +RBIF 00000000 +RD 00000000 +REPEAT_COUNT 00000003 +REPEAT_DELAY 00000057 +RP0 00000005 +RP1 00000006 +SCLK 00000001 +SDAT 00000000 +SLATCH 00000002 +STATUS 00000003 +T0CS 00000005 +T0IE 00000005 + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 13 + + +SYMBOL TABLE + LABEL VALUE + +T0IF 00000002 +T0SE 00000004 +TMR0 00000001 +TMR0_CNT 00000005 +TMR0_PRE 00000004 +TMR0_PRIME 000000FB +TRISA 00000085 +TRISB 00000086 +TRISKEY 00000086 +TRISOUT 00000085 +W 00000000 +WR 00000001 +WREN 00000002 +WRERR 00000003 +Z 00000002 +_CP_OFF 00003FFF +_CP_ON 0000000F +_HS_OSC 00003FFE +_LP_OSC 00003FFC +_PWRTE_OFF 00003FFF +_PWRTE_ON 00003FF7 +_RC_OSC 00003FFF +_WDT_OFF 00003FFB +_WDT_ON 00003FFF +_XT_OSC 00003FFD +__16F84A 00000001 +_fsr 0000000C +_pclath 0000000D +_status 0000000E +_w 0000000F +bit2row 00000083 +check_key 000000B0 +clock_bit 0000009E +col1_keys 0000006F +col1_xlate 000000C7 +col2_keys 00000074 +col2_xlate 000000CB +col3_keys 00000079 +col3_xlate 000000CF +col4_keys 0000007E +col4_xlate 000000D3 +col_select 00000069 +count 00000011 +current_col 00000012 +debounce 000000AE +init 000000DC +key_get 000000AC +key_out 0000008D +key_scan 00000028 +key_val 00000013 +key_xlate 000000BC +main 00000020 +matched 000000B8 + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 14 + + +SYMBOL TABLE + LABEL VALUE + +par_out 00000010 +restore_context 00000017 +scan 00000021 +scan_delay 00000039 +serial_latch 000000A7 +serial_out 00000098 +shift_bit 0000009A +tmr0_svc 00000011 +tmr128 00000006 +tmr16 00000003 +tmr2 00000000 +tmr256 00000007 +tmr32 00000004 +tmr4 00000001 +tmr64 00000005 +tmr8 00000002 +wait 000000D7 +wait_count 00000014 +waiting 000000D8 + + +MEMORY USAGE MAP ('X' = Used, '-' = Unused) + +0000 : X---XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX +0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX +0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX +00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXX----------- +2000 : XXXX---X-------- ---------------- ---------------- ---------------- + +All other memory blocks unused. + +Program Memory Words Used: 242 +Program Memory Words Free: 782 + + +Errors : 0 +Warnings : 0 reported, 0 suppressed +Messages : 0 reported, 4 suppressed + + \ No newline at end of file diff --git a/keypad.png b/keypad.png new file mode 100644 index 0000000..321b197 --- /dev/null +++ b/keypad.png Binary files differ diff --git a/keypad.ps b/keypad.ps new file mode 100644 index 0000000..a39c1b1 --- /dev/null +++ b/keypad.ps @@ -0,0 +1,2689 @@ +%!PS-Adobe-1.0 +%%Title: EAGLE Drawing C:/USR/HOME/TUNDRA/DEV/PIC/KEYPAD/SCHEMA~1/keypad.sch +%%Creator: EAGLE +%%Pages: 1 +%%BoundingBox: 0 0 576 810 +%%EndComments + +% Coordinate transfer: + +/EU { 254 div 0.072 mul } def +/inch { 72 mul } def + +% Linestyle: + +1 setlinecap +1 setlinejoin + +% Drawing functions: + +/l { % draw a line + /lw exch def + /y2 exch def + /x2 exch def + /y1 exch def + /x1 exch def + newpath + x1 EU y1 EU moveto + x2 EU y2 EU lineto + lw EU setlinewidth + stroke + } def + +/h { % draw a hole + /d exch def + /y exch def + /x exch def + d 0 gt { + newpath + x EU y EU d 2 div EU 0 360 arc + currentgray dup + 1 exch sub setgray + fill + setgray + } if + } def + +/b { % draw a bar + /y2 exch def + /x2 exch def + /y1 exch def + /x1 exch def + newpath + x1 EU y1 EU moveto + x2 EU y1 EU lineto + x2 EU y2 EU lineto + x1 EU y2 EU lineto + closepath + fill + } def + +/c { % draw a circle + /lw exch def + /rd exch def + /y exch def + /x exch def + newpath + lw EU setlinewidth + x EU y EU rd EU 0 360 arc + stroke + } def + +/a { % draw an arc + /lc exch def + /ae exch def + /as exch def + /lw exch def + /rd exch def + /y exch def + /x exch def + lw rd 2 mul gt { + /rd rd lw 2 div add 2 div def + /lw rd 2 mul def + } if + currentlinecap currentlinejoin + lc setlinecap 0 setlinejoin + newpath + lw EU setlinewidth + x EU y EU rd EU as ae arc + stroke + setlinejoin setlinecap + } def + +/s { % draw a square + /d exch def + /y exch def + /x exch def + newpath + x d 2 div sub EU y d 2 div sub EU moveto + d EU 0 EU rlineto + 0 EU d EU rlineto + d neg EU 0 EU rlineto + closepath + fill + } def + +/p { % draw a pie + /d exch def + /y exch def + /x exch def + newpath + x EU y EU d 2 div EU 0 360 arc + fill + } def + +/edge { 0.20710678119 mul } def + +/o { % draw an octagon + /dy exch def + /dx exch def + /y exch def + /x exch def + newpath + dx dy ge { + x dx 2 div sub EU y dy edge add EU moveto + x dx dy sub 2 div sub dy edge sub EU y dy 2 div add EU lineto + x dx dy sub 2 div add dy edge add EU y dy 2 div add EU lineto + x dx 2 div add EU y dy edge add EU lineto + x dx 2 div add EU y dy edge sub EU lineto + x dx dy sub 2 div add dy edge add EU y dy 2 div sub EU lineto + x dx dy sub 2 div sub dy edge sub EU y dy 2 div sub EU lineto + x dx 2 div sub EU y dy edge sub EU lineto + } if + dx dy lt { + x dx edge add EU y dy 2 div add EU moveto + x dx 2 div add EU y dy dx sub 2 div add dx edge add EU lineto + x dx 2 div add EU y dy dx sub 2 div sub dx edge sub EU lineto + x dx edge add EU y dy 2 div sub EU lineto + x dx edge sub EU y dy 2 div sub EU lineto + x dx 2 div sub EU y dy dx sub 2 div sub dx edge sub EU lineto + x dx 2 div sub EU y dy dx sub 2 div add dx edge add EU lineto + x dx edge sub EU y dy 2 div add EU lineto + } if + closepath + fill + } def + +% the real drawing size: + +/MinDrawX 0 EU def +/MinDrawY 0 EU def +/MaxDrawX 1885564 EU def +/MaxDrawY 1967716 EU def + +% the usable page size: + +/LeftMargin 0.25 inch def % change these if drawing gets clipped! +/BotMargin 0.25 inch def +/PageWidth 7.7500 inch def +/PageHeight 11.0000 inch def + +% are we going to rotate?: + +/RotateDrawing 0 0 ne def + +% Media size functions: + +/AbortMessage { % Show a message in a box and stop printing + /h 100 def + /Courier findfont 12 scalefont setfont + mediawidth pagemargin sub h 1 setpage + newpath + 0 0 moveto + 0 h rlineto + mediawidth pagemargin sub 0 rlineto + 0 h neg rlineto + closepath + 5 setlinewidth + stroke + newpath 50 60 moveto (ERROR: Jobsize exceeds physical printing area!) show + newpath 50 40 moveto ( Job has been aborted!) show + showpage + stop + } def + +/SelectPage { % Select the page identified by Row and Column + /Column exch def + /Row exch def + + % the actually exposed area (if the machine knows these parameters!): + + /DrawX MaxDrawX MinDrawX sub def + /DrawY MaxDrawY MinDrawY sub def + statusdict /setpage known + statusdict /mediawidth known and + statusdict /medialength known and + statusdict /pagemargin known and { + % this is for machines that can tell the media size: + statusdict begin + /MediaW mediawidth pagemargin sub def + DrawX DrawY ge { + DrawX MediaW le DrawY medialength le and { + MediaW DrawY 1 setpage + MediaW DrawX sub 2 div 0 translate + }{ + DrawY MediaW le DrawX medialength le and { + MediaW DrawX 0 setpage + 0 MediaW DrawY sub 2 div translate + }{ + AbortMessage + } ifelse + } ifelse + }{ + DrawY MediaW le DrawX medialength le and { + MediaW DrawX 0 setpage + 0 MediaW DrawY sub 2 div translate + }{ + DrawX MediaW le DrawY medialength le and { + MediaW DrawY 1 setpage + MediaW DrawX sub 2 div 0 translate + }{ + AbortMessage + } ifelse + } ifelse + } ifelse + end + }{ + % this is for machines that can NOT tell the media size: + % (Ghostscript doesn't like this!) + /Product product length string def + /i 0 def + product { dup 97 lt { 32 add } if Product exch i exch put /i i 1 add def } forall + Product (ghostscript) search dup /IsGhostscript exch def + { pop pop } if + pop + IsGhostscript not { + statusdict /setpage known { + statusdict begin + RotateDrawing { + LeftMargin PageHeight add BotMargin DrawY add + }{ + BotMargin DrawY add LeftMargin DrawX add + } ifelse + 0 setpage + end + } if + } if + % set clipping boundary: + newpath + LeftMargin BotMargin moveto + 0 PageHeight rlineto + PageWidth 0 rlineto + 0 PageHeight neg rlineto + closepath + clip + % set the origin: + LeftMargin BotMargin translate + RotateDrawing { + 0 PageHeight translate + -90 rotate + PageHeight Column mul neg PageWidth Row mul neg translate + }{ + PageWidth Column mul neg PageHeight Row mul neg translate + } ifelse + } ifelse + % move the lower left corner of the drawing to the origin: + MinDrawX neg MinDrawY neg translate + + % Linestyle: + + 1 setlinecap + 1 setlinejoin + + } def + +% TheDrawing + +gsave 0 0 SelectPage +631782 1031470 631782 1063569 2789 l +621083 1063569 642482 1063569 2789 l +653182 1052869 653182 1036819 2789 l +653182 1036819 658531 1031470 2789 l +658531 1031470 674581 1031470 2789 l +674581 1031470 674581 1052869 2789 l +685281 1031470 685281 1052869 2789 l +685281 1052869 701330 1052869 2789 l +701330 1052869 706680 1047519 2789 l +706680 1047519 706680 1031470 2789 l +738779 1063569 738779 1031470 2789 l +738779 1031470 722729 1031470 2789 l +722729 1031470 717380 1036819 2789 l +717380 1036819 717380 1047519 2789 l +717380 1047519 722729 1052869 2789 l +722729 1052869 738779 1052869 2789 l +749479 1031470 749479 1052869 2789 l +749479 1042169 760178 1052869 2789 l +760178 1052869 765528 1052869 2789 l +786927 1052869 797627 1052869 2789 l +797627 1052869 802977 1047519 2789 l +802977 1047519 802977 1031470 2789 l +802977 1031470 786927 1031470 2789 l +786927 1031470 781578 1036819 2789 l +781578 1036819 786927 1042169 2789 l +786927 1042169 802977 1042169 2789 l +813677 1063569 813677 1031470 2789 l +813677 1031470 824377 1042169 2789 l +824377 1042169 835077 1031470 2789 l +835077 1031470 835077 1063569 2789 l +851126 1052869 861826 1052869 2789 l +861826 1052869 867176 1047519 2789 l +867176 1047519 867176 1031470 2789 l +867176 1031470 851126 1031470 2789 l +851126 1031470 845777 1036819 2789 l +845777 1036819 851126 1042169 2789 l +851126 1042169 867176 1042169 2789 l +877876 1031470 877876 1052869 2789 l +877876 1042169 888575 1052869 2789 l +888575 1052869 893925 1052869 2789 l +926024 1031470 915324 1031470 2789 l +915324 1031470 909975 1036819 2789 l +909975 1036819 909975 1047519 2789 l +909975 1047519 915324 1052869 2789 l +915324 1052869 926024 1052869 2789 l +926024 1052869 931374 1047519 2789 l +931374 1047519 931374 1042169 2789 l +931374 1042169 909975 1042169 2789 l +974173 1031470 974173 1063569 2789 l +974173 1063569 990222 1063569 2789 l +990222 1063569 995572 1058219 2789 l +995572 1058219 995572 1047519 2789 l +995572 1047519 990222 1042169 2789 l +990222 1042169 974173 1042169 2789 l +1006272 1031470 1016971 1031470 2789 l +1011621 1031470 1011621 1063569 2789 l +1006272 1063569 1016971 1063569 2789 l +1054420 1058219 1049070 1063569 2789 l +1049070 1063569 1038370 1063569 2789 l +1038370 1063569 1033021 1058219 2789 l +1033021 1058219 1033021 1036819 2789 l +1033021 1036819 1038370 1031470 2789 l +1038370 1031470 1049070 1031470 2789 l +1049070 1031470 1054420 1036819 2789 l +1097220 1063569 1097220 1031470 2789 l +1097220 1042169 1118619 1063569 2789 l +1102569 1047519 1118619 1031470 2789 l +1145368 1031470 1134668 1031470 2789 l +1134668 1031470 1129319 1036819 2789 l +1129319 1036819 1129319 1047519 2789 l +1129319 1047519 1134668 1052869 2789 l +1134668 1052869 1145368 1052869 2789 l +1145368 1052869 1150718 1047519 2789 l +1150718 1047519 1150718 1042169 2789 l +1150718 1042169 1129319 1042169 2789 l +1161418 1052869 1161418 1036819 2789 l +1161418 1036819 1166767 1031470 2789 l +1166767 1031470 1182817 1031470 2789 l +1182817 1052869 1182817 1026121 2789 l +1182817 1026121 1177467 1020771 2789 l +1177467 1020771 1172117 1020771 2789 l +1193517 1020771 1193517 1052869 2789 l +1193517 1052869 1209566 1052869 2789 l +1209566 1052869 1214916 1047519 2789 l +1214916 1047519 1214916 1036819 2789 l +1214916 1036819 1209566 1031470 2789 l +1209566 1031470 1193517 1031470 2789 l +1230965 1052869 1241665 1052869 2789 l +1241665 1052869 1247015 1047519 2789 l +1247015 1047519 1247015 1031470 2789 l +1247015 1031470 1230965 1031470 2789 l +1230965 1031470 1225616 1036819 2789 l +1225616 1036819 1230965 1042169 2789 l +1230965 1042169 1247015 1042169 2789 l +1279114 1063569 1279114 1031470 2789 l +1279114 1031470 1263064 1031470 2789 l +1263064 1031470 1257715 1036819 2789 l +1257715 1036819 1257715 1047519 2789 l +1257715 1047519 1263064 1052869 2789 l +1263064 1052869 1279114 1052869 2789 l +1321913 1063569 1321913 1031470 2789 l +1321913 1031470 1337962 1031470 2789 l +1337962 1031470 1343312 1036819 2789 l +1343312 1036819 1343312 1058219 2789 l +1343312 1058219 1337962 1063569 2789 l +1337962 1063569 1321913 1063569 2789 l +1370062 1031470 1359362 1031470 2789 l +1359362 1031470 1354012 1036819 2789 l +1354012 1036819 1354012 1047519 2789 l +1354012 1047519 1359362 1052869 2789 l +1359362 1052869 1370062 1052869 2789 l +1370062 1052869 1375412 1047519 2789 l +1375412 1047519 1375412 1042169 2789 l +1375412 1042169 1354012 1042169 2789 l +1407511 1052869 1391461 1052869 2789 l +1391461 1052869 1386112 1047519 2789 l +1386112 1047519 1386112 1036819 2789 l +1386112 1036819 1391461 1031470 2789 l +1391461 1031470 1407511 1031470 2789 l +1423560 1031470 1434260 1031470 2789 l +1434260 1031470 1439610 1036819 2789 l +1439610 1036819 1439610 1047519 2789 l +1439610 1047519 1434260 1052869 2789 l +1434260 1052869 1423560 1052869 2789 l +1423560 1052869 1418211 1047519 2789 l +1418211 1047519 1418211 1036819 2789 l +1418211 1036819 1423560 1031470 2789 l +1471709 1063569 1471709 1031470 2789 l +1471709 1031470 1455659 1031470 2789 l +1455659 1031470 1450310 1036819 2789 l +1450310 1036819 1450310 1047519 2789 l +1450310 1047519 1455659 1052869 2789 l +1455659 1052869 1471709 1052869 2789 l +1498458 1031470 1487758 1031470 2789 l +1487758 1031470 1482409 1036819 2789 l +1482409 1036819 1482409 1047519 2789 l +1482409 1047519 1487758 1052869 2789 l +1487758 1052869 1498458 1052869 2789 l +1498458 1052869 1503808 1047519 2789 l +1503808 1047519 1503808 1042169 2789 l +1503808 1042169 1482409 1042169 2789 l +1514508 1031470 1514508 1052869 2789 l +1514508 1042169 1525207 1052869 2789 l +1525207 1052869 1530557 1052869 2789 l +1485880 1628996 1485880 1639696 930 l +1485880 1639696 1491229 1639696 930 l +1491229 1639696 1493013 1637912 930 l +1493013 1637912 1493013 1634346 930 l +1493013 1634346 1491229 1632562 930 l +1491229 1632562 1485880 1632562 930 l +1489446 1632562 1493013 1628996 930 l +1498362 1628996 1501929 1628996 930 l +1501929 1628996 1503712 1630779 930 l +1503712 1630779 1503712 1634346 930 l +1503712 1634346 1501929 1636129 930 l +1501929 1636129 1498362 1636129 930 l +1498362 1636129 1496579 1634346 930 l +1496579 1634346 1496579 1630779 930 l +1496579 1630779 1498362 1628996 930 l +1507279 1636129 1507279 1630779 930 l +1507279 1630779 1509061 1628996 930 l +1509061 1628996 1510844 1630779 930 l +1510844 1630779 1512628 1628996 930 l +1512628 1628996 1514411 1630779 930 l +1514411 1630779 1514411 1636129 930 l +1528677 1637912 1530459 1639696 930 l +1530459 1639696 1530459 1628996 930 l +1528677 1628996 1532243 1628996 930 l +1485880 1652237 1485880 1662937 930 l +1485880 1662937 1491229 1662937 930 l +1491229 1662937 1493013 1661153 930 l +1493013 1661153 1493013 1657587 930 l +1493013 1657587 1491229 1655803 930 l +1491229 1655803 1485880 1655803 930 l +1489446 1655803 1493013 1652237 930 l +1498362 1652237 1501929 1652237 930 l +1501929 1652237 1503712 1654020 930 l +1503712 1654020 1503712 1657587 930 l +1503712 1657587 1501929 1659370 930 l +1501929 1659370 1498362 1659370 930 l +1498362 1659370 1496579 1657587 930 l +1496579 1657587 1496579 1654020 930 l +1496579 1654020 1498362 1652237 930 l +1507279 1659370 1507279 1654020 930 l +1507279 1654020 1509061 1652237 930 l +1509061 1652237 1510844 1654020 930 l +1510844 1654020 1512628 1652237 930 l +1512628 1652237 1514411 1654020 930 l +1514411 1654020 1514411 1659370 930 l +1535809 1652237 1528677 1652237 930 l +1528677 1652237 1535809 1659370 930 l +1535809 1659370 1535809 1661153 930 l +1535809 1661153 1534026 1662937 930 l +1534026 1662937 1530459 1662937 930 l +1530459 1662937 1528677 1661153 930 l +1485880 1675478 1485880 1686178 930 l +1485880 1686178 1491229 1686178 930 l +1491229 1686178 1493013 1684394 930 l +1493013 1684394 1493013 1680828 930 l +1493013 1680828 1491229 1679044 930 l +1491229 1679044 1485880 1679044 930 l +1489446 1679044 1493013 1675478 930 l +1498362 1675478 1501929 1675478 930 l +1501929 1675478 1503712 1677261 930 l +1503712 1677261 1503712 1680828 930 l +1503712 1680828 1501929 1682611 930 l +1501929 1682611 1498362 1682611 930 l +1498362 1682611 1496579 1680828 930 l +1496579 1680828 1496579 1677261 930 l +1496579 1677261 1498362 1675478 930 l +1507279 1682611 1507279 1677261 930 l +1507279 1677261 1509061 1675478 930 l +1509061 1675478 1510844 1677261 930 l +1510844 1677261 1512628 1675478 930 l +1512628 1675478 1514411 1677261 930 l +1514411 1677261 1514411 1682611 930 l +1528677 1684394 1530459 1686178 930 l +1530459 1686178 1534026 1686178 930 l +1534026 1686178 1535809 1684394 930 l +1535809 1684394 1535809 1682611 930 l +1535809 1682611 1534026 1680828 930 l +1534026 1680828 1532243 1680828 930 l +1534026 1680828 1535809 1679044 930 l +1535809 1679044 1535809 1677261 930 l +1535809 1677261 1534026 1675478 930 l +1534026 1675478 1530459 1675478 930 l +1530459 1675478 1528677 1677261 930 l +1485880 1698719 1485880 1709419 930 l +1485880 1709419 1491229 1709419 930 l +1491229 1709419 1493013 1707635 930 l +1493013 1707635 1493013 1704069 930 l +1493013 1704069 1491229 1702285 930 l +1491229 1702285 1485880 1702285 930 l +1489446 1702285 1493013 1698719 930 l +1498362 1698719 1501929 1698719 930 l +1501929 1698719 1503712 1700502 930 l +1503712 1700502 1503712 1704069 930 l +1503712 1704069 1501929 1705852 930 l +1501929 1705852 1498362 1705852 930 l +1498362 1705852 1496579 1704069 930 l +1496579 1704069 1496579 1700502 930 l +1496579 1700502 1498362 1698719 930 l +1507279 1705852 1507279 1700502 930 l +1507279 1700502 1509061 1698719 930 l +1509061 1698719 1510844 1700502 930 l +1510844 1700502 1512628 1698719 930 l +1512628 1698719 1514411 1700502 930 l +1514411 1700502 1514411 1705852 930 l +1534026 1698719 1534026 1709419 930 l +1534026 1709419 1528677 1704069 930 l +1528677 1704069 1535809 1704069 930 l +1493013 1730876 1491229 1732660 930 l +1491229 1732660 1487663 1732660 930 l +1487663 1732660 1485880 1730876 930 l +1485880 1730876 1485880 1723743 930 l +1485880 1723743 1487663 1721960 930 l +1487663 1721960 1491229 1721960 930 l +1491229 1721960 1493013 1723743 930 l +1498362 1721960 1501929 1721960 930 l +1501929 1721960 1503712 1723743 930 l +1503712 1723743 1503712 1727310 930 l +1503712 1727310 1501929 1729093 930 l +1501929 1729093 1498362 1729093 930 l +1498362 1729093 1496579 1727310 930 l +1496579 1727310 1496579 1723743 930 l +1496579 1723743 1498362 1721960 930 l +1507279 1732660 1509061 1732660 930 l +1509061 1732660 1509061 1721960 930 l +1507279 1721960 1510844 1721960 930 l +1526893 1730876 1528676 1732660 930 l +1528676 1732660 1528676 1721960 930 l +1526893 1721960 1530459 1721960 930 l +1493013 1754117 1491229 1755901 930 l +1491229 1755901 1487663 1755901 930 l +1487663 1755901 1485880 1754117 930 l +1485880 1754117 1485880 1746984 930 l +1485880 1746984 1487663 1745201 930 l +1487663 1745201 1491229 1745201 930 l +1491229 1745201 1493013 1746984 930 l +1498362 1745201 1501929 1745201 930 l +1501929 1745201 1503712 1746984 930 l +1503712 1746984 1503712 1750551 930 l +1503712 1750551 1501929 1752334 930 l +1501929 1752334 1498362 1752334 930 l +1498362 1752334 1496579 1750551 930 l +1496579 1750551 1496579 1746984 930 l +1496579 1746984 1498362 1745201 930 l +1507279 1755901 1509061 1755901 930 l +1509061 1755901 1509061 1745201 930 l +1507279 1745201 1510844 1745201 930 l +1534026 1745201 1526893 1745201 930 l +1526893 1745201 1534026 1752334 930 l +1534026 1752334 1534026 1754117 930 l +1534026 1754117 1532243 1755901 930 l +1532243 1755901 1528676 1755901 930 l +1528676 1755901 1526893 1754117 930 l +1493013 1777358 1491229 1779142 930 l +1491229 1779142 1487663 1779142 930 l +1487663 1779142 1485880 1777358 930 l +1485880 1777358 1485880 1770225 930 l +1485880 1770225 1487663 1768442 930 l +1487663 1768442 1491229 1768442 930 l +1491229 1768442 1493013 1770225 930 l +1498362 1768442 1501929 1768442 930 l +1501929 1768442 1503712 1770225 930 l +1503712 1770225 1503712 1773792 930 l +1503712 1773792 1501929 1775575 930 l +1501929 1775575 1498362 1775575 930 l +1498362 1775575 1496579 1773792 930 l +1496579 1773792 1496579 1770225 930 l +1496579 1770225 1498362 1768442 930 l +1507279 1779142 1509061 1779142 930 l +1509061 1779142 1509061 1768442 930 l +1507279 1768442 1510844 1768442 930 l +1526893 1777358 1528676 1779142 930 l +1528676 1779142 1532243 1779142 930 l +1532243 1779142 1534026 1777358 930 l +1534026 1777358 1534026 1775575 930 l +1534026 1775575 1532243 1773792 930 l +1532243 1773792 1530459 1773792 930 l +1532243 1773792 1534026 1772008 930 l +1534026 1772008 1534026 1770225 930 l +1534026 1770225 1532243 1768442 930 l +1532243 1768442 1528676 1768442 930 l +1528676 1768442 1526893 1770225 930 l +1493013 1800599 1491229 1802383 930 l +1491229 1802383 1487663 1802383 930 l +1487663 1802383 1485880 1800599 930 l +1485880 1800599 1485880 1793466 930 l +1485880 1793466 1487663 1791683 930 l +1487663 1791683 1491229 1791683 930 l +1491229 1791683 1493013 1793466 930 l +1498362 1791683 1501929 1791683 930 l +1501929 1791683 1503712 1793466 930 l +1503712 1793466 1503712 1797033 930 l +1503712 1797033 1501929 1798816 930 l +1501929 1798816 1498362 1798816 930 l +1498362 1798816 1496579 1797033 930 l +1496579 1797033 1496579 1793466 930 l +1496579 1793466 1498362 1791683 930 l +1507279 1802383 1509061 1802383 930 l +1509061 1802383 1509061 1791683 930 l +1507279 1791683 1510844 1791683 930 l +1532243 1791683 1532243 1802383 930 l +1532243 1802383 1526893 1797033 930 l +1526893 1797033 1534026 1797033 930 l +1493013 1451984 1491229 1453768 930 l +1491229 1453768 1487663 1453768 930 l +1487663 1453768 1485880 1451984 930 l +1485880 1451984 1485880 1450201 930 l +1485880 1450201 1487663 1448418 930 l +1487663 1448418 1491229 1448418 930 l +1491229 1448418 1493013 1446634 930 l +1493013 1446634 1493013 1444851 930 l +1493013 1444851 1491229 1443068 930 l +1491229 1443068 1487663 1443068 930 l +1487663 1443068 1485880 1444851 930 l +1501929 1443068 1498362 1443068 930 l +1498362 1443068 1496579 1444851 930 l +1496579 1444851 1496579 1448418 930 l +1496579 1448418 1498362 1450201 930 l +1498362 1450201 1501929 1450201 930 l +1501929 1450201 1503712 1448418 930 l +1503712 1448418 1503712 1446634 930 l +1503712 1446634 1496579 1446634 930 l +1507279 1443068 1507279 1450201 930 l +1507279 1446634 1510844 1450201 930 l +1510844 1450201 1512628 1450201 930 l +1517978 1450201 1519760 1450201 930 l +1519760 1450201 1519760 1443068 930 l +1517978 1443068 1521543 1443068 930 l +1519760 1455551 1519760 1453768 930 l +1528676 1450201 1532243 1450201 930 l +1532243 1450201 1534026 1448418 930 l +1534026 1448418 1534026 1443068 930 l +1534026 1443068 1528676 1443068 930 l +1528676 1443068 1526893 1444851 930 l +1526893 1444851 1528676 1446634 930 l +1528676 1446634 1534026 1446634 930 l +1537593 1453768 1539375 1453768 930 l +1539375 1453768 1539375 1443068 930 l +1537593 1443068 1541158 1443068 930 l +1557207 1453768 1557207 1443068 930 l +1557207 1443068 1562556 1443068 930 l +1562556 1443068 1564340 1444851 930 l +1564340 1444851 1564340 1451984 930 l +1564340 1451984 1562556 1453768 930 l +1562556 1453768 1557207 1453768 930 l +1569689 1450201 1573256 1450201 930 l +1573256 1450201 1575039 1448418 930 l +1575039 1448418 1575039 1443068 930 l +1575039 1443068 1569689 1443068 930 l +1569689 1443068 1567906 1444851 930 l +1567906 1444851 1569689 1446634 930 l +1569689 1446634 1575039 1446634 930 l +1580388 1451984 1580388 1444851 930 l +1580388 1444851 1582171 1443068 930 l +1578606 1450201 1582171 1450201 930 l +1589304 1450201 1592870 1450201 930 l +1592870 1450201 1594654 1448418 930 l +1594654 1448418 1594654 1443068 930 l +1594654 1443068 1589304 1443068 930 l +1589304 1443068 1587521 1444851 930 l +1587521 1444851 1589304 1446634 930 l +1589304 1446634 1594654 1446634 930 l +1608920 1443068 1616052 1453768 930 l +1630318 1443068 1630318 1453768 930 l +1630318 1453768 1635667 1453768 930 l +1635667 1453768 1637450 1451984 930 l +1637450 1451984 1637450 1448418 930 l +1637450 1448418 1635667 1446634 930 l +1635667 1446634 1630318 1446634 930 l +1642799 1450201 1646366 1450201 930 l +1646366 1450201 1648149 1448418 930 l +1648149 1448418 1648149 1443068 930 l +1648149 1443068 1642799 1443068 930 l +1642799 1443068 1641017 1444851 930 l +1641017 1444851 1642799 1446634 930 l +1642799 1446634 1648149 1446634 930 l +1651716 1443068 1651716 1450201 930 l +1651716 1446634 1655282 1450201 930 l +1655282 1450201 1657065 1450201 930 l +1664197 1450201 1667764 1450201 930 l +1667764 1450201 1669547 1448418 930 l +1669547 1448418 1669547 1443068 930 l +1669547 1443068 1664197 1443068 930 l +1664197 1443068 1662415 1444851 930 l +1662415 1444851 1664197 1446634 930 l +1664197 1446634 1669547 1446634 930 l +1673114 1453768 1674897 1453768 930 l +1674897 1453768 1674897 1443068 930 l +1673114 1443068 1676680 1443068 930 l +1682030 1453768 1683812 1453768 930 l +1683812 1453768 1683812 1443068 930 l +1682030 1443068 1685596 1443068 930 l +1696295 1443068 1692728 1443068 930 l +1692728 1443068 1690946 1444851 930 l +1690946 1444851 1690946 1448418 930 l +1690946 1448418 1692728 1450201 930 l +1692728 1450201 1696295 1450201 930 l +1696295 1450201 1698078 1448418 930 l +1698078 1448418 1698078 1446634 930 l +1698078 1446634 1690946 1446634 930 l +1701645 1453768 1703427 1453768 930 l +1703427 1453768 1703427 1443068 930 l +1701645 1443068 1705210 1443068 930 l +1721260 1443068 1721260 1453768 930 l +1721260 1453768 1726609 1453768 930 l +1726609 1453768 1728392 1451984 930 l +1728392 1451984 1728392 1450201 930 l +1728392 1450201 1726609 1448418 930 l +1726609 1448418 1728392 1446634 930 l +1728392 1446634 1728392 1444851 930 l +1728392 1444851 1726609 1443068 930 l +1726609 1443068 1721260 1443068 930 l +1721260 1448418 1726609 1448418 930 l +1731959 1444851 1731959 1451984 930 l +1731959 1451984 1733741 1453768 930 l +1733741 1453768 1737308 1453768 930 l +1737308 1453768 1739091 1451984 930 l +1739091 1451984 1739091 1444851 930 l +1739091 1444851 1737308 1443068 930 l +1737308 1443068 1733741 1443068 930 l +1733741 1443068 1731959 1444851 930 l +1731959 1444851 1739091 1451984 930 l +1493013 1475225 1491229 1477009 930 l +1491229 1477009 1487663 1477009 930 l +1487663 1477009 1485880 1475225 930 l +1485880 1475225 1485880 1473442 930 l +1485880 1473442 1487663 1471659 930 l +1487663 1471659 1491229 1471659 930 l +1491229 1471659 1493013 1469875 930 l +1493013 1469875 1493013 1468092 930 l +1493013 1468092 1491229 1466309 930 l +1491229 1466309 1487663 1466309 930 l +1487663 1466309 1485880 1468092 930 l +1501929 1466309 1498362 1466309 930 l +1498362 1466309 1496579 1468092 930 l +1496579 1468092 1496579 1471659 930 l +1496579 1471659 1498362 1473442 930 l +1498362 1473442 1501929 1473442 930 l +1501929 1473442 1503712 1471659 930 l +1503712 1471659 1503712 1469875 930 l +1503712 1469875 1496579 1469875 930 l +1507279 1466309 1507279 1473442 930 l +1507279 1469875 1510844 1473442 930 l +1510844 1473442 1512628 1473442 930 l +1517978 1473442 1519760 1473442 930 l +1519760 1473442 1519760 1466309 930 l +1517978 1466309 1521543 1466309 930 l +1519760 1478792 1519760 1477009 930 l +1528676 1473442 1532243 1473442 930 l +1532243 1473442 1534026 1471659 930 l +1534026 1471659 1534026 1466309 930 l +1534026 1466309 1528676 1466309 930 l +1528676 1466309 1526893 1468092 930 l +1526893 1468092 1528676 1469875 930 l +1528676 1469875 1534026 1469875 930 l +1537593 1477009 1539375 1477009 930 l +1539375 1477009 1539375 1466309 930 l +1537593 1466309 1541158 1466309 930 l +1564340 1475225 1562556 1477009 930 l +1562556 1477009 1558990 1477009 930 l +1558990 1477009 1557207 1475225 930 l +1557207 1475225 1557207 1468092 930 l +1557207 1468092 1558990 1466309 930 l +1558990 1466309 1562556 1466309 930 l +1562556 1466309 1564340 1468092 930 l +1567906 1477009 1569689 1477009 930 l +1569689 1477009 1569689 1466309 930 l +1567906 1466309 1571472 1466309 930 l +1578605 1466309 1582171 1466309 930 l +1582171 1466309 1583955 1468092 930 l +1583955 1468092 1583955 1471659 930 l +1583955 1471659 1582171 1473442 930 l +1582171 1473442 1578605 1473442 930 l +1578605 1473442 1576822 1471659 930 l +1576822 1471659 1576822 1468092 930 l +1576822 1468092 1578605 1466309 930 l +1594654 1473442 1589304 1473442 930 l +1589304 1473442 1587521 1471659 930 l +1587521 1471659 1587521 1468092 930 l +1587521 1468092 1589304 1466309 930 l +1589304 1466309 1594654 1466309 930 l +1598220 1466309 1598220 1477009 930 l +1603570 1466309 1598220 1469875 930 l +1598220 1469875 1603570 1473442 930 l +1619619 1466309 1626751 1477009 930 l +1641017 1466309 1641017 1477009 930 l +1641017 1477009 1646366 1477009 930 l +1646366 1477009 1648149 1475225 930 l +1648149 1475225 1648149 1471659 930 l +1648149 1471659 1646366 1469875 930 l +1646366 1469875 1641017 1469875 930 l +1653498 1473442 1657065 1473442 930 l +1657065 1473442 1658848 1471659 930 l +1658848 1471659 1658848 1466309 930 l +1658848 1466309 1653498 1466309 930 l +1653498 1466309 1651716 1468092 930 l +1651716 1468092 1653498 1469875 930 l +1653498 1469875 1658848 1469875 930 l +1662415 1466309 1662415 1473442 930 l +1662415 1469875 1665981 1473442 930 l +1665981 1473442 1667764 1473442 930 l +1674897 1473442 1678463 1473442 930 l +1678463 1473442 1680247 1471659 930 l +1680247 1471659 1680247 1466309 930 l +1680247 1466309 1674897 1466309 930 l +1674897 1466309 1673114 1468092 930 l +1673114 1468092 1674897 1469875 930 l +1674897 1469875 1680247 1469875 930 l +1683813 1477009 1685596 1477009 930 l +1685596 1477009 1685596 1466309 930 l +1683813 1466309 1687379 1466309 930 l +1692729 1477009 1694511 1477009 930 l +1694511 1477009 1694511 1466309 930 l +1692729 1466309 1696295 1466309 930 l +1706994 1466309 1703427 1466309 930 l +1703427 1466309 1701645 1468092 930 l +1701645 1468092 1701645 1471659 930 l +1701645 1471659 1703427 1473442 930 l +1703427 1473442 1706994 1473442 930 l +1706994 1473442 1708777 1471659 930 l +1708777 1471659 1708777 1469875 930 l +1708777 1469875 1701645 1469875 930 l +1712344 1477009 1714126 1477009 930 l +1714126 1477009 1714126 1466309 930 l +1712344 1466309 1715910 1466309 930 l +1731959 1466309 1731959 1477009 930 l +1731959 1477009 1737308 1477009 930 l +1737308 1477009 1739091 1475225 930 l +1739091 1475225 1739091 1473442 930 l +1739091 1473442 1737308 1471659 930 l +1737308 1471659 1739091 1469875 930 l +1739091 1469875 1739091 1468092 930 l +1739091 1468092 1737308 1466309 930 l +1737308 1466309 1731959 1466309 930 l +1731959 1471659 1737308 1471659 930 l +1742658 1475225 1744440 1477009 930 l +1744440 1477009 1744440 1466309 930 l +1742658 1466309 1746224 1466309 930 l +1493013 1498466 1491229 1500250 930 l +1491229 1500250 1487663 1500250 930 l +1487663 1500250 1485880 1498466 930 l +1485880 1498466 1485880 1496683 930 l +1485880 1496683 1487663 1494900 930 l +1487663 1494900 1491229 1494900 930 l +1491229 1494900 1493013 1493116 930 l +1493013 1493116 1493013 1491333 930 l +1493013 1491333 1491229 1489550 930 l +1491229 1489550 1487663 1489550 930 l +1487663 1489550 1485880 1491333 930 l +1501929 1489550 1498362 1489550 930 l +1498362 1489550 1496579 1491333 930 l +1496579 1491333 1496579 1494900 930 l +1496579 1494900 1498362 1496683 930 l +1498362 1496683 1501929 1496683 930 l +1501929 1496683 1503712 1494900 930 l +1503712 1494900 1503712 1493116 930 l +1503712 1493116 1496579 1493116 930 l +1507279 1489550 1507279 1496683 930 l +1507279 1493116 1510844 1496683 930 l +1510844 1496683 1512628 1496683 930 l +1517978 1496683 1519760 1496683 930 l +1519760 1496683 1519760 1489550 930 l +1517978 1489550 1521543 1489550 930 l +1519760 1502033 1519760 1500250 930 l +1528676 1496683 1532243 1496683 930 l +1532243 1496683 1534026 1494900 930 l +1534026 1494900 1534026 1489550 930 l +1534026 1489550 1528676 1489550 930 l +1528676 1489550 1526893 1491333 930 l +1526893 1491333 1528676 1493116 930 l +1528676 1493116 1534026 1493116 930 l +1537593 1500250 1539375 1500250 930 l +1539375 1500250 1539375 1489550 930 l +1537593 1489550 1541158 1489550 930 l +1557207 1500250 1557207 1489550 930 l +1557207 1489550 1564340 1489550 930 l +1569689 1496683 1573256 1496683 930 l +1573256 1496683 1575039 1494900 930 l +1575039 1494900 1575039 1489550 930 l +1575039 1489550 1569689 1489550 930 l +1569689 1489550 1567906 1491333 930 l +1567906 1491333 1569689 1493116 930 l +1569689 1493116 1575039 1493116 930 l +1580388 1498466 1580388 1491333 930 l +1580388 1491333 1582171 1489550 930 l +1578606 1496683 1582171 1496683 930 l +1594654 1496683 1589304 1496683 930 l +1589304 1496683 1587521 1494900 930 l +1587521 1494900 1587521 1491333 930 l +1587521 1491333 1589304 1489550 930 l +1589304 1489550 1594654 1489550 930 l +1598220 1500250 1598220 1489550 930 l +1598220 1494900 1600003 1496683 930 l +1600003 1496683 1603570 1496683 930 l +1603570 1496683 1605353 1494900 930 l +1605353 1494900 1605353 1489550 930 l +1619619 1489550 1626751 1500250 930 l +1641017 1489550 1641017 1500250 930 l +1641017 1500250 1646366 1500250 930 l +1646366 1500250 1648149 1498466 930 l +1648149 1498466 1648149 1494900 930 l +1648149 1494900 1646366 1493116 930 l +1646366 1493116 1641017 1493116 930 l +1653498 1496683 1657065 1496683 930 l +1657065 1496683 1658848 1494900 930 l +1658848 1494900 1658848 1489550 930 l +1658848 1489550 1653498 1489550 930 l +1653498 1489550 1651716 1491333 930 l +1651716 1491333 1653498 1493116 930 l +1653498 1493116 1658848 1493116 930 l +1662415 1489550 1662415 1496683 930 l +1662415 1493116 1665981 1496683 930 l +1665981 1496683 1667764 1496683 930 l +1674897 1496683 1678463 1496683 930 l +1678463 1496683 1680247 1494900 930 l +1680247 1494900 1680247 1489550 930 l +1680247 1489550 1674897 1489550 930 l +1674897 1489550 1673114 1491333 930 l +1673114 1491333 1674897 1493116 930 l +1674897 1493116 1680247 1493116 930 l +1683813 1500250 1685596 1500250 930 l +1685596 1500250 1685596 1489550 930 l +1683813 1489550 1687379 1489550 930 l +1692729 1500250 1694511 1500250 930 l +1694511 1500250 1694511 1489550 930 l +1692729 1489550 1696295 1489550 930 l +1706994 1489550 1703427 1489550 930 l +1703427 1489550 1701645 1491333 930 l +1701645 1491333 1701645 1494900 930 l +1701645 1494900 1703427 1496683 930 l +1703427 1496683 1706994 1496683 930 l +1706994 1496683 1708777 1494900 930 l +1708777 1494900 1708777 1493116 930 l +1708777 1493116 1701645 1493116 930 l +1712344 1500250 1714126 1500250 930 l +1714126 1500250 1714126 1489550 930 l +1712344 1489550 1715910 1489550 930 l +1731959 1489550 1731959 1500250 930 l +1731959 1500250 1737308 1500250 930 l +1737308 1500250 1739091 1498466 930 l +1739091 1498466 1739091 1496683 930 l +1739091 1496683 1737308 1494900 930 l +1737308 1494900 1739091 1493116 930 l +1739091 1493116 1739091 1491333 930 l +1739091 1491333 1737308 1489550 930 l +1737308 1489550 1731959 1489550 930 l +1731959 1494900 1737308 1494900 930 l +1749790 1489550 1742658 1489550 930 l +1742658 1489550 1749790 1496683 930 l +1749790 1496683 1749790 1498466 930 l +1749790 1498466 1748007 1500250 930 l +1748007 1500250 1744440 1500250 930 l +1744440 1500250 1742658 1498466 930 l +1485880 1512791 1485880 1523491 930 l +1485880 1523491 1491229 1523491 930 l +1491229 1523491 1493013 1521707 930 l +1493013 1521707 1493013 1518141 930 l +1493013 1518141 1491229 1516357 930 l +1491229 1516357 1485880 1516357 930 l +1498362 1519924 1501929 1519924 930 l +1501929 1519924 1503712 1518141 930 l +1503712 1518141 1503712 1512791 930 l +1503712 1512791 1498362 1512791 930 l +1498362 1512791 1496579 1514574 930 l +1496579 1514574 1498362 1516357 930 l +1498362 1516357 1503712 1516357 930 l +1507279 1512791 1507279 1519924 930 l +1507279 1516357 1510844 1519924 930 l +1510844 1519924 1512628 1519924 930 l +1519760 1519924 1523327 1519924 930 l +1523327 1519924 1525110 1518141 930 l +1525110 1518141 1525110 1512791 930 l +1525110 1512791 1519760 1512791 930 l +1519760 1512791 1517978 1514574 930 l +1517978 1514574 1519760 1516357 930 l +1519760 1516357 1525110 1516357 930 l +1528677 1523491 1530459 1523491 930 l +1530459 1523491 1530459 1512791 930 l +1528677 1512791 1532243 1512791 930 l +1537593 1523491 1539375 1523491 930 l +1539375 1523491 1539375 1512791 930 l +1537593 1512791 1541158 1512791 930 l +1551857 1512791 1548291 1512791 930 l +1548291 1512791 1546508 1514574 930 l +1546508 1514574 1546508 1518141 930 l +1546508 1518141 1548291 1519924 930 l +1548291 1519924 1551857 1519924 930 l +1551857 1519924 1553641 1518141 930 l +1553641 1518141 1553641 1516357 930 l +1553641 1516357 1546508 1516357 930 l +1557207 1523491 1558990 1523491 930 l +1558990 1523491 1558990 1512791 930 l +1557207 1512791 1560773 1512791 930 l +1576822 1512791 1576822 1523491 930 l +1576822 1523491 1582171 1523491 930 l +1582171 1523491 1583955 1521707 930 l +1583955 1521707 1583955 1519924 930 l +1583955 1519924 1582171 1518141 930 l +1582171 1518141 1583955 1516357 930 l +1583955 1516357 1583955 1514574 930 l +1583955 1514574 1582171 1512791 930 l +1582171 1512791 1576822 1512791 930 l +1576822 1518141 1582171 1518141 930 l +1587521 1521707 1589304 1523491 930 l +1589304 1523491 1592870 1523491 930 l +1592870 1523491 1594654 1521707 930 l +1594654 1521707 1594654 1519924 930 l +1594654 1519924 1592870 1518141 930 l +1592870 1518141 1591087 1518141 930 l +1592870 1518141 1594654 1516357 930 l +1594654 1516357 1594654 1514574 930 l +1594654 1514574 1592870 1512791 930 l +1592870 1512791 1589304 1512791 930 l +1589304 1512791 1587521 1514574 930 l +1493013 1544948 1491229 1546732 930 l +1491229 1546732 1487663 1546732 930 l +1487663 1546732 1485880 1544948 930 l +1485880 1544948 1485880 1543165 930 l +1485880 1543165 1487663 1541382 930 l +1487663 1541382 1491229 1541382 930 l +1491229 1541382 1493013 1539598 930 l +1493013 1539598 1493013 1537815 930 l +1493013 1537815 1491229 1536032 930 l +1491229 1536032 1487663 1536032 930 l +1487663 1536032 1485880 1537815 930 l +1501929 1536032 1498362 1536032 930 l +1498362 1536032 1496579 1537815 930 l +1496579 1537815 1496579 1541382 930 l +1496579 1541382 1498362 1543165 930 l +1498362 1543165 1501929 1543165 930 l +1501929 1543165 1503712 1541382 930 l +1503712 1541382 1503712 1539598 930 l +1503712 1539598 1496579 1539598 930 l +1507279 1536032 1507279 1543165 930 l +1507279 1539598 1510844 1543165 930 l +1510844 1543165 1512628 1543165 930 l +1517978 1543165 1519760 1543165 930 l +1519760 1543165 1519760 1536032 930 l +1517978 1536032 1521543 1536032 930 l +1519760 1548515 1519760 1546732 930 l +1528676 1543165 1532243 1543165 930 l +1532243 1543165 1534026 1541382 930 l +1534026 1541382 1534026 1536032 930 l +1534026 1536032 1528676 1536032 930 l +1528676 1536032 1526893 1537815 930 l +1526893 1537815 1528676 1539598 930 l +1528676 1539598 1534026 1539598 930 l +1537593 1546732 1539375 1546732 930 l +1539375 1546732 1539375 1536032 930 l +1537593 1536032 1541158 1536032 930 l +1546508 1541382 1553641 1541382 930 l +1557207 1536032 1557207 1546732 930 l +1557207 1546732 1562556 1546732 930 l +1562556 1546732 1564340 1544948 930 l +1564340 1544948 1564340 1541382 930 l +1564340 1541382 1562556 1539598 930 l +1562556 1539598 1557207 1539598 930 l +1569689 1543165 1573256 1543165 930 l +1573256 1543165 1575039 1541382 930 l +1575039 1541382 1575039 1536032 930 l +1575039 1536032 1569689 1536032 930 l +1569689 1536032 1567906 1537815 930 l +1567906 1537815 1569689 1539598 930 l +1569689 1539598 1575039 1539598 930 l +1578606 1536032 1578606 1543165 930 l +1578606 1539598 1582171 1543165 930 l +1582171 1543165 1583955 1543165 930 l +1591087 1543165 1594654 1543165 930 l +1594654 1543165 1596437 1541382 930 l +1596437 1541382 1596437 1536032 930 l +1596437 1536032 1591087 1536032 930 l +1591087 1536032 1589305 1537815 930 l +1589305 1537815 1591087 1539598 930 l +1591087 1539598 1596437 1539598 930 l +1600004 1546732 1601786 1546732 930 l +1601786 1546732 1601786 1536032 930 l +1600004 1536032 1603570 1536032 930 l +1608920 1546732 1610702 1546732 930 l +1610702 1546732 1610702 1536032 930 l +1608920 1536032 1612485 1536032 930 l +1623184 1536032 1619618 1536032 930 l +1619618 1536032 1617835 1537815 930 l +1617835 1537815 1617835 1541382 930 l +1617835 1541382 1619618 1543165 930 l +1619618 1543165 1623184 1543165 930 l +1623184 1543165 1624968 1541382 930 l +1624968 1541382 1624968 1539598 930 l +1624968 1539598 1617835 1539598 930 l +1628534 1546732 1630317 1546732 930 l +1630317 1546732 1630317 1536032 930 l +1628534 1536032 1632100 1536032 930 l +1655282 1544948 1653498 1546732 930 l +1653498 1546732 1649932 1546732 930 l +1649932 1546732 1648149 1544948 930 l +1648149 1544948 1648149 1543165 930 l +1648149 1543165 1649932 1541382 930 l +1649932 1541382 1653498 1541382 930 l +1653498 1541382 1655282 1539598 930 l +1655282 1539598 1655282 1537815 930 l +1655282 1537815 1653498 1536032 930 l +1653498 1536032 1649932 1536032 930 l +1649932 1536032 1648149 1537815 930 l +1664197 1536032 1660631 1536032 930 l +1660631 1536032 1658848 1537815 930 l +1658848 1537815 1658848 1541382 930 l +1658848 1541382 1660631 1543165 930 l +1660631 1543165 1664197 1543165 930 l +1664197 1543165 1665981 1541382 930 l +1665981 1541382 1665981 1539598 930 l +1665981 1539598 1658848 1539598 930 l +1669547 1546732 1671330 1546732 930 l +1671330 1546732 1671330 1536032 930 l +1669547 1536032 1673113 1536032 930 l +1683812 1536032 1680246 1536032 930 l +1680246 1536032 1678463 1537815 930 l +1678463 1537815 1678463 1541382 930 l +1678463 1541382 1680246 1543165 930 l +1680246 1543165 1683812 1543165 930 l +1683812 1543165 1685596 1541382 930 l +1685596 1541382 1685596 1539598 930 l +1685596 1539598 1678463 1539598 930 l +1696295 1543165 1690945 1543165 930 l +1690945 1543165 1689162 1541382 930 l +1689162 1541382 1689162 1537815 930 l +1689162 1537815 1690945 1536032 930 l +1690945 1536032 1696295 1536032 930 l +1701644 1544948 1701644 1537815 930 l +1701644 1537815 1703427 1536032 930 l +1699861 1543165 1703427 1543165 930 l +1719476 1536032 1726609 1546732 930 l +1740874 1536032 1740874 1546732 930 l +1740874 1546732 1746224 1546732 930 l +1746224 1546732 1748007 1544948 930 l +1748007 1544948 1748007 1541382 930 l +1748007 1541382 1746224 1539598 930 l +1746224 1539598 1740874 1539598 930 l +1753356 1543165 1756923 1543165 930 l +1756923 1543165 1758706 1541382 930 l +1758706 1541382 1758706 1536032 930 l +1758706 1536032 1753356 1536032 930 l +1753356 1536032 1751574 1537815 930 l +1751574 1537815 1753356 1539598 930 l +1753356 1539598 1758706 1539598 930 l +1762273 1536032 1762273 1543165 930 l +1762273 1539598 1765838 1543165 930 l +1765838 1543165 1767622 1543165 930 l +1774754 1543165 1778321 1543165 930 l +1778321 1543165 1780104 1541382 930 l +1780104 1541382 1780104 1536032 930 l +1780104 1536032 1774754 1536032 930 l +1774754 1536032 1772972 1537815 930 l +1772972 1537815 1774754 1539598 930 l +1774754 1539598 1780104 1539598 930 l +1783671 1546732 1785453 1546732 930 l +1785453 1546732 1785453 1536032 930 l +1783671 1536032 1787237 1536032 930 l +1792587 1546732 1794369 1546732 930 l +1794369 1546732 1794369 1536032 930 l +1792587 1536032 1796152 1536032 930 l +1806851 1536032 1803285 1536032 930 l +1803285 1536032 1801502 1537815 930 l +1801502 1537815 1801502 1541382 930 l +1801502 1541382 1803285 1543165 930 l +1803285 1543165 1806851 1543165 930 l +1806851 1543165 1808635 1541382 930 l +1808635 1541382 1808635 1539598 930 l +1808635 1539598 1801502 1539598 930 l +1812201 1546732 1813984 1546732 930 l +1813984 1546732 1813984 1536032 930 l +1812201 1536032 1815767 1536032 930 l +1831816 1546732 1831816 1536032 930 l +1831816 1536032 1838949 1536032 930 l +1844298 1543165 1847864 1543165 930 l +1847864 1543165 1849648 1541382 930 l +1849648 1541382 1849648 1536032 930 l +1849648 1536032 1844298 1536032 930 l +1844298 1536032 1842515 1537815 930 l +1842515 1537815 1844298 1539598 930 l +1844298 1539598 1849648 1539598 930 l +1854997 1544948 1854997 1537815 930 l +1854997 1537815 1856780 1536032 930 l +1853214 1543165 1856780 1543165 930 l +1869263 1543165 1863913 1543165 930 l +1863913 1543165 1862130 1541382 930 l +1862130 1541382 1862130 1537815 930 l +1862130 1537815 1863913 1536032 930 l +1863913 1536032 1869263 1536032 930 l +1872829 1546732 1872829 1536032 930 l +1872829 1541382 1874612 1543165 930 l +1874612 1543165 1878178 1543165 930 l +1878178 1543165 1879962 1541382 930 l +1879962 1541382 1879962 1536032 930 l +967025 1581469 967025 1594261 1162 l +967025 1594261 971289 1589997 1162 l +971289 1589997 975554 1594261 1162 l +975554 1594261 975554 1581469 1162 l +988393 1592129 986260 1594261 1162 l +986260 1594261 981996 1594261 1162 l +981996 1594261 979864 1592129 1162 l +979864 1592129 979864 1583601 1162 l +979864 1583601 981996 1581469 1162 l +981996 1581469 986260 1581469 1162 l +986260 1581469 988393 1583601 1162 l +992704 1594261 992704 1581469 1162 l +992704 1581469 1001232 1581469 1162 l +1005543 1581469 1005543 1594261 1162 l +1005543 1594261 1011939 1594261 1162 l +1011939 1594261 1014072 1592129 1162 l +1014072 1592129 1014072 1587864 1162 l +1014072 1587864 1011939 1585733 1162 l +1011939 1585733 1005543 1585733 1162 l +1009807 1585733 1014072 1581469 1162 l +1026911 1581469 1018382 1594261 1162 l +921821 1587860 945062 1587860 1394 l +935946 1591695 935946 1604487 1162 l +935946 1604487 929550 1598091 1162 l +929550 1598091 938079 1598091 1162 l +973421 1687225 969157 1687225 1162 l +969157 1687225 967025 1685093 1162 l +967025 1685093 967025 1676565 1162 l +967025 1676565 969157 1674433 1162 l +969157 1674433 973421 1674433 1162 l +973421 1674433 975554 1676565 1162 l +975554 1676565 975554 1685093 1162 l +975554 1685093 973421 1687225 1162 l +988393 1685093 986260 1687225 1162 l +986260 1687225 981996 1687225 1162 l +981996 1687225 979864 1685093 1162 l +979864 1685093 979864 1682961 1162 l +979864 1682961 981996 1680828 1162 l +981996 1680828 986260 1680828 1162 l +986260 1680828 988393 1678697 1162 l +988393 1678697 988393 1676565 1162 l +988393 1676565 986260 1674433 1162 l +986260 1674433 981996 1674433 1162 l +981996 1674433 979864 1676565 1162 l +1001232 1685093 999099 1687225 1162 l +999099 1687225 994836 1687225 1162 l +994836 1687225 992704 1685093 1162 l +992704 1685093 992704 1676565 1162 l +992704 1676565 994836 1674433 1162 l +994836 1674433 999099 1674433 1162 l +999099 1674433 1001232 1676565 1162 l +1005543 1685093 1007675 1687225 1162 l +1007675 1687225 1007675 1674433 1162 l +1005543 1674433 1009807 1674433 1162 l +921821 1680824 945062 1680824 1394 l +918850 1695319 920982 1697451 1162 l +920982 1697451 920982 1684659 1162 l +918850 1684659 923114 1684659 1162 l +938078 1697451 933813 1695319 1162 l +933813 1695319 929549 1691055 1162 l +929549 1691055 929549 1686791 1162 l +929549 1686791 931681 1684659 1162 l +931681 1684659 935945 1684659 1162 l +935945 1684659 938078 1686791 1162 l +938078 1686791 938078 1688923 1162 l +938078 1688923 935945 1691055 1162 l +935945 1691055 929549 1691055 1162 l +1071670 1442023 1071670 1454815 1162 l +1071670 1454815 1078066 1454815 1162 l +1078066 1454815 1080199 1452683 1162 l +1080199 1452683 1080199 1448418 1162 l +1080199 1448418 1078066 1446287 1162 l +1078066 1446287 1071670 1446287 1162 l +1075934 1446287 1080199 1442023 1162 l +1084509 1442023 1084509 1450551 1162 l +1084509 1450551 1088773 1454815 1162 l +1088773 1454815 1093038 1450551 1162 l +1093038 1450551 1093038 1442023 1162 l +1084509 1448418 1093038 1448418 1162 l +1097349 1444155 1097349 1452683 1162 l +1097349 1452683 1099480 1454815 1162 l +1099480 1454815 1103744 1454815 1162 l +1103744 1454815 1105877 1452683 1162 l +1105877 1452683 1105877 1444155 1162 l +1105877 1444155 1103744 1442023 1162 l +1103744 1442023 1099480 1442023 1162 l +1099480 1442023 1097349 1444155 1162 l +1097349 1444155 1105877 1452683 1162 l +1154231 1448414 1130990 1448414 1394 l +1134825 1462909 1136957 1465041 1162 l +1136957 1465041 1136957 1452249 1162 l +1134825 1452249 1139089 1452249 1162 l +1145524 1465041 1154053 1465041 1162 l +1154053 1465041 1154053 1462909 1162 l +1154053 1462909 1145524 1454381 1162 l +1145524 1454381 1145524 1452249 1162 l +1073810 1465264 1073810 1478056 1162 l +1073810 1478056 1080206 1478056 1162 l +1080206 1478056 1082339 1475924 1162 l +1082339 1475924 1082339 1471659 1162 l +1082339 1471659 1080206 1469528 1162 l +1080206 1469528 1073810 1469528 1162 l +1078074 1469528 1082339 1465264 1162 l +1086649 1465264 1086649 1473792 1162 l +1086649 1473792 1090913 1478056 1162 l +1090913 1478056 1095178 1473792 1162 l +1095178 1473792 1095178 1465264 1162 l +1086649 1471659 1095178 1471659 1162 l +1099489 1475924 1101621 1478056 1162 l +1101621 1478056 1101621 1465264 1162 l +1099489 1465264 1103753 1465264 1162 l +1154231 1471655 1130990 1471655 1394 l +1134825 1486150 1136957 1488282 1162 l +1136957 1488282 1136957 1475490 1162 l +1134825 1475490 1139089 1475490 1162 l +1145524 1486150 1147656 1488282 1162 l +1147656 1488282 1151920 1488282 1162 l +1151920 1488282 1154053 1486150 1162 l +1154053 1486150 1154053 1484018 1162 l +1154053 1484018 1151920 1481886 1162 l +1151920 1481886 1154053 1479754 1162 l +1154053 1479754 1154053 1477622 1162 l +1154053 1477622 1151920 1475490 1162 l +1151920 1475490 1147656 1475490 1162 l +1147656 1475490 1145524 1477622 1162 l +1145524 1477622 1145524 1479754 1162 l +1145524 1479754 1147656 1481886 1162 l +1147656 1481886 1145524 1484018 1162 l +1145524 1484018 1145524 1486150 1162 l +1147656 1481886 1151920 1481886 1162 l +1071670 1488505 1071670 1501297 1162 l +1071670 1501297 1078066 1501297 1162 l +1078066 1501297 1080199 1499165 1162 l +1080199 1499165 1080199 1494900 1162 l +1080199 1494900 1078066 1492769 1162 l +1078066 1492769 1071670 1492769 1162 l +1075934 1492769 1080199 1488505 1162 l +1084509 1488505 1084509 1497033 1162 l +1084509 1497033 1088773 1501297 1162 l +1088773 1501297 1093038 1497033 1162 l +1093038 1497033 1093038 1488505 1162 l +1084509 1494900 1093038 1494900 1162 l +1105877 1488505 1097349 1488505 1162 l +1097349 1488505 1105877 1497033 1162 l +1105877 1497033 1105877 1499165 1162 l +1105877 1499165 1103744 1501297 1162 l +1103744 1501297 1099480 1501297 1162 l +1099480 1501297 1097349 1499165 1162 l +1154231 1494896 1130990 1494896 1394 l +1134825 1509391 1136957 1511523 1162 l +1136957 1511523 1136957 1498731 1162 l +1134825 1498731 1139089 1498731 1162 l +1071670 1511746 1071670 1524538 1162 l +1071670 1524538 1078066 1524538 1162 l +1078066 1524538 1080199 1522406 1162 l +1080199 1522406 1080199 1518141 1162 l +1080199 1518141 1078066 1516010 1162 l +1078066 1516010 1071670 1516010 1162 l +1075934 1516010 1080199 1511746 1162 l +1084509 1511746 1084509 1520274 1162 l +1084509 1520274 1088773 1524538 1162 l +1088773 1524538 1093038 1520274 1162 l +1093038 1520274 1093038 1511746 1162 l +1084509 1518141 1093038 1518141 1162 l +1097349 1522406 1099480 1524538 1162 l +1099480 1524538 1103744 1524538 1162 l +1103744 1524538 1105877 1522406 1162 l +1105877 1522406 1105877 1520274 1162 l +1105877 1520274 1103744 1518141 1162 l +1103744 1518141 1101612 1518141 1162 l +1103744 1518141 1105877 1516010 1162 l +1105877 1516010 1105877 1513878 1162 l +1105877 1513878 1103744 1511746 1162 l +1103744 1511746 1099480 1511746 1162 l +1099480 1511746 1097349 1513878 1162 l +1154231 1518137 1130990 1518137 1394 l +1143354 1521972 1134825 1521972 1162 l +1134825 1521972 1143354 1530500 1162 l +1143354 1530500 1143354 1532632 1162 l +1143354 1532632 1141221 1534764 1162 l +1141221 1534764 1136957 1534764 1162 l +1136957 1534764 1134825 1532632 1162 l +1001034 1534987 1001034 1547779 1162 l +996770 1547779 1005299 1547779 1162 l +1009609 1537119 1009609 1545647 1162 l +1009609 1545647 1011741 1547779 1162 l +1011741 1547779 1016005 1547779 1162 l +1016005 1547779 1018138 1545647 1162 l +1018138 1545647 1018138 1537119 1162 l +1018138 1537119 1016005 1534987 1162 l +1016005 1534987 1011741 1534987 1162 l +1011741 1534987 1009609 1537119 1162 l +1009609 1537119 1018138 1545647 1162 l +1030977 1545647 1028844 1547779 1162 l +1028844 1547779 1024580 1547779 1162 l +1024580 1547779 1022448 1545647 1162 l +1022448 1545647 1022448 1537119 1162 l +1022448 1537119 1024580 1534987 1162 l +1024580 1534987 1028844 1534987 1162 l +1028844 1534987 1030977 1537119 1162 l +1035288 1547779 1035288 1534987 1162 l +1035288 1539251 1043816 1547779 1162 l +1037420 1541382 1043816 1534987 1162 l +1048127 1534987 1052391 1534987 1162 l +1050259 1534987 1050259 1547779 1162 l +1048127 1547779 1052391 1547779 1162 l +1058826 1534987 1067355 1547779 1162 l +1071665 1534987 1071665 1547779 1162 l +1071665 1547779 1078061 1547779 1162 l +1078061 1547779 1080194 1545647 1162 l +1080194 1545647 1080194 1541382 1162 l +1080194 1541382 1078061 1539251 1162 l +1078061 1539251 1071665 1539251 1162 l +1075929 1539251 1080194 1534987 1162 l +1084505 1534987 1084505 1543515 1162 l +1084505 1543515 1088769 1547779 1162 l +1088769 1547779 1093033 1543515 1162 l +1093033 1543515 1093033 1534987 1162 l +1084505 1541382 1093033 1541382 1162 l +1103740 1534987 1103740 1547779 1162 l +1103740 1547779 1097344 1541382 1162 l +1097344 1541382 1105873 1541382 1162 l +1154231 1541378 1130990 1541378 1394 l +1134825 1555873 1136957 1558005 1162 l +1136957 1558005 1141221 1558005 1162 l +1141221 1558005 1143354 1555873 1162 l +1143354 1555873 1143354 1553741 1162 l +1143354 1553741 1141221 1551609 1162 l +1141221 1551609 1139089 1551609 1162 l +1141221 1551609 1143354 1549477 1162 l +1143354 1549477 1143354 1547345 1162 l +1143354 1547345 1141221 1545213 1162 l +1141221 1545213 1136957 1545213 1162 l +1136957 1545213 1134825 1547345 1162 l +1071670 1581469 1071670 1594261 1162 l +1071670 1594261 1078066 1594261 1162 l +1078066 1594261 1080199 1592129 1162 l +1080199 1592129 1080199 1587864 1162 l +1080199 1587864 1078066 1585733 1162 l +1078066 1585733 1071670 1585733 1162 l +1075934 1585733 1080199 1581469 1162 l +1084509 1581469 1084509 1594261 1162 l +1084509 1594261 1090905 1594261 1162 l +1090905 1594261 1093038 1592129 1162 l +1093038 1592129 1093038 1589997 1162 l +1093038 1589997 1090905 1587864 1162 l +1090905 1587864 1093038 1585733 1162 l +1093038 1585733 1093038 1583601 1162 l +1093038 1583601 1090905 1581469 1162 l +1090905 1581469 1084509 1581469 1162 l +1084509 1587864 1090905 1587864 1162 l +1097349 1583601 1097349 1592129 1162 l +1097349 1592129 1099480 1594261 1162 l +1099480 1594261 1103744 1594261 1162 l +1103744 1594261 1105877 1592129 1162 l +1105877 1592129 1105877 1583601 1162 l +1105877 1583601 1103744 1581469 1162 l +1103744 1581469 1099480 1581469 1162 l +1099480 1581469 1097349 1583601 1162 l +1097349 1583601 1105877 1592129 1162 l +1154231 1587860 1130990 1587860 1394 l +1143354 1604487 1139089 1602355 1162 l +1139089 1602355 1134825 1598091 1162 l +1134825 1598091 1134825 1593827 1162 l +1134825 1593827 1136957 1591695 1162 l +1136957 1591695 1141221 1591695 1162 l +1141221 1591695 1143354 1593827 1162 l +1143354 1593827 1143354 1595959 1162 l +1143354 1595959 1141221 1598091 1162 l +1141221 1598091 1134825 1598091 1162 l +1073810 1604710 1073810 1617502 1162 l +1073810 1617502 1080206 1617502 1162 l +1080206 1617502 1082339 1615370 1162 l +1082339 1615370 1082339 1611105 1162 l +1082339 1611105 1080206 1608974 1162 l +1080206 1608974 1073810 1608974 1162 l +1078074 1608974 1082339 1604710 1162 l +1086649 1604710 1086649 1617502 1162 l +1086649 1617502 1093045 1617502 1162 l +1093045 1617502 1095178 1615370 1162 l +1095178 1615370 1095178 1613238 1162 l +1095178 1613238 1093045 1611105 1162 l +1093045 1611105 1095178 1608974 1162 l +1095178 1608974 1095178 1606842 1162 l +1095178 1606842 1093045 1604710 1162 l +1093045 1604710 1086649 1604710 1162 l +1086649 1611105 1093045 1611105 1162 l +1099489 1615370 1101621 1617502 1162 l +1101621 1617502 1101621 1604710 1162 l +1099489 1604710 1103753 1604710 1162 l +1154231 1611101 1130990 1611101 1394 l +1134825 1627728 1143354 1627728 1162 l +1143354 1627728 1143354 1625596 1162 l +1143354 1625596 1134825 1617068 1162 l +1134825 1617068 1134825 1614936 1162 l +1071670 1627951 1071670 1640743 1162 l +1071670 1640743 1078066 1640743 1162 l +1078066 1640743 1080199 1638611 1162 l +1080199 1638611 1080199 1634346 1162 l +1080199 1634346 1078066 1632215 1162 l +1078066 1632215 1071670 1632215 1162 l +1075934 1632215 1080199 1627951 1162 l +1084509 1627951 1084509 1640743 1162 l +1084509 1640743 1090905 1640743 1162 l +1090905 1640743 1093038 1638611 1162 l +1093038 1638611 1093038 1636479 1162 l +1093038 1636479 1090905 1634346 1162 l +1090905 1634346 1093038 1632215 1162 l +1093038 1632215 1093038 1630083 1162 l +1093038 1630083 1090905 1627951 1162 l +1090905 1627951 1084509 1627951 1162 l +1084509 1634346 1090905 1634346 1162 l +1105877 1627951 1097349 1627951 1162 l +1097349 1627951 1105877 1636479 1162 l +1105877 1636479 1105877 1638611 1162 l +1105877 1638611 1103744 1640743 1162 l +1103744 1640743 1099480 1640743 1162 l +1099480 1640743 1097349 1638611 1162 l +1154231 1634342 1130990 1634342 1394 l +1134825 1648837 1136957 1650969 1162 l +1136957 1650969 1141221 1650969 1162 l +1141221 1650969 1143354 1648837 1162 l +1143354 1648837 1143354 1646705 1162 l +1143354 1646705 1141221 1644573 1162 l +1141221 1644573 1143354 1642441 1162 l +1143354 1642441 1143354 1640309 1162 l +1143354 1640309 1141221 1638177 1162 l +1141221 1638177 1136957 1638177 1162 l +1136957 1638177 1134825 1640309 1162 l +1134825 1640309 1134825 1642441 1162 l +1134825 1642441 1136957 1644573 1162 l +1136957 1644573 1134825 1646705 1162 l +1134825 1646705 1134825 1648837 1162 l +1136957 1644573 1141221 1644573 1162 l +1071670 1651192 1071670 1663984 1162 l +1071670 1663984 1078066 1663984 1162 l +1078066 1663984 1080199 1661852 1162 l +1080199 1661852 1080199 1657587 1162 l +1080199 1657587 1078066 1655456 1162 l +1078066 1655456 1071670 1655456 1162 l +1075934 1655456 1080199 1651192 1162 l +1084509 1651192 1084509 1663984 1162 l +1084509 1663984 1090905 1663984 1162 l +1090905 1663984 1093038 1661852 1162 l +1093038 1661852 1093038 1659720 1162 l +1093038 1659720 1090905 1657587 1162 l +1090905 1657587 1093038 1655456 1162 l +1093038 1655456 1093038 1653324 1162 l +1093038 1653324 1090905 1651192 1162 l +1090905 1651192 1084509 1651192 1162 l +1084509 1657587 1090905 1657587 1162 l +1097349 1661852 1099480 1663984 1162 l +1099480 1663984 1103744 1663984 1162 l +1103744 1663984 1105877 1661852 1162 l +1105877 1661852 1105877 1659720 1162 l +1105877 1659720 1103744 1657587 1162 l +1103744 1657587 1101612 1657587 1162 l +1103744 1657587 1105877 1655456 1162 l +1105877 1655456 1105877 1653324 1162 l +1105877 1653324 1103744 1651192 1162 l +1103744 1651192 1099480 1651192 1162 l +1099480 1651192 1097349 1653324 1162 l +1154231 1657583 1130990 1657583 1394 l +1134825 1663550 1136957 1661418 1162 l +1136957 1661418 1141221 1661418 1162 l +1141221 1661418 1143354 1663550 1162 l +1143354 1663550 1143354 1672078 1162 l +1143354 1672078 1141221 1674210 1162 l +1141221 1674210 1136957 1674210 1162 l +1136957 1674210 1134825 1672078 1162 l +1134825 1672078 1134825 1669946 1162 l +1134825 1669946 1136957 1667814 1162 l +1136957 1667814 1143354 1667814 1162 l +1071670 1674433 1071670 1687225 1162 l +1071670 1687225 1078066 1687225 1162 l +1078066 1687225 1080199 1685093 1162 l +1080199 1685093 1080199 1680828 1162 l +1080199 1680828 1078066 1678697 1162 l +1078066 1678697 1071670 1678697 1162 l +1075934 1678697 1080199 1674433 1162 l +1084509 1674433 1084509 1687225 1162 l +1084509 1687225 1090905 1687225 1162 l +1090905 1687225 1093038 1685093 1162 l +1093038 1685093 1093038 1682961 1162 l +1093038 1682961 1090905 1680828 1162 l +1090905 1680828 1093038 1678697 1162 l +1093038 1678697 1093038 1676565 1162 l +1093038 1676565 1090905 1674433 1162 l +1090905 1674433 1084509 1674433 1162 l +1084509 1680828 1090905 1680828 1162 l +1103744 1674433 1103744 1687225 1162 l +1103744 1687225 1097349 1680828 1162 l +1097349 1680828 1105877 1680828 1162 l +1154231 1680824 1130990 1680824 1394 l +1134825 1695319 1136957 1697451 1162 l +1136957 1697451 1136957 1684659 1162 l +1134825 1684659 1139089 1684659 1162 l +1145524 1686791 1145524 1695319 1162 l +1145524 1695319 1147656 1697451 1162 l +1147656 1697451 1151920 1697451 1162 l +1151920 1697451 1154053 1695319 1162 l +1154053 1695319 1154053 1686791 1162 l +1154053 1686791 1151920 1684659 1162 l +1151920 1684659 1147656 1684659 1162 l +1147656 1684659 1145524 1686791 1162 l +1145524 1686791 1154053 1695319 1162 l +1071670 1697674 1071670 1710466 1162 l +1071670 1710466 1078066 1710466 1162 l +1078066 1710466 1080199 1708334 1162 l +1080199 1708334 1080199 1704069 1162 l +1080199 1704069 1078066 1701938 1162 l +1078066 1701938 1071670 1701938 1162 l +1075934 1701938 1080199 1697674 1162 l +1084509 1697674 1084509 1710466 1162 l +1084509 1710466 1090905 1710466 1162 l +1090905 1710466 1093038 1708334 1162 l +1093038 1708334 1093038 1706202 1162 l +1093038 1706202 1090905 1704069 1162 l +1090905 1704069 1093038 1701938 1162 l +1093038 1701938 1093038 1699806 1162 l +1093038 1699806 1090905 1697674 1162 l +1090905 1697674 1084509 1697674 1162 l +1084509 1704069 1090905 1704069 1162 l +1105877 1710466 1097349 1710466 1162 l +1097349 1710466 1097349 1704069 1162 l +1097349 1704069 1101612 1706202 1162 l +1101612 1706202 1103744 1706202 1162 l +1103744 1706202 1105877 1704069 1162 l +1105877 1704069 1105877 1699806 1162 l +1105877 1699806 1103744 1697674 1162 l +1103744 1697674 1099480 1697674 1162 l +1099480 1697674 1097349 1699806 1162 l +1154231 1704065 1130990 1704065 1394 l +1134825 1718560 1136957 1720692 1162 l +1136957 1720692 1136957 1707900 1162 l +1134825 1707900 1139089 1707900 1162 l +1145524 1718560 1147656 1720692 1162 l +1147656 1720692 1147656 1707900 1162 l +1145524 1707900 1149788 1707900 1162 l +1071670 1720915 1071670 1733707 1162 l +1071670 1733707 1078066 1733707 1162 l +1078066 1733707 1080199 1731575 1162 l +1080199 1731575 1080199 1727310 1162 l +1080199 1727310 1078066 1725179 1162 l +1078066 1725179 1071670 1725179 1162 l +1075934 1725179 1080199 1720915 1162 l +1084509 1720915 1084509 1733707 1162 l +1084509 1733707 1090905 1733707 1162 l +1090905 1733707 1093038 1731575 1162 l +1093038 1731575 1093038 1729443 1162 l +1093038 1729443 1090905 1727310 1162 l +1090905 1727310 1093038 1725179 1162 l +1093038 1725179 1093038 1723047 1162 l +1093038 1723047 1090905 1720915 1162 l +1090905 1720915 1084509 1720915 1162 l +1084509 1727310 1090905 1727310 1162 l +1105877 1733707 1101612 1731575 1162 l +1101612 1731575 1097349 1727310 1162 l +1097349 1727310 1097349 1723047 1162 l +1097349 1723047 1099480 1720915 1162 l +1099480 1720915 1103744 1720915 1162 l +1103744 1720915 1105877 1723047 1162 l +1105877 1723047 1105877 1725179 1162 l +1105877 1725179 1103744 1727310 1162 l +1103744 1727310 1097349 1727310 1162 l +1154231 1727306 1130990 1727306 1394 l +1134825 1741801 1136957 1743933 1162 l +1136957 1743933 1136957 1731141 1162 l +1134825 1731141 1139089 1731141 1162 l +1154053 1731141 1145524 1731141 1162 l +1145524 1731141 1154053 1739669 1162 l +1154053 1739669 1154053 1741801 1162 l +1154053 1741801 1151920 1743933 1162 l +1151920 1743933 1147656 1743933 1162 l +1147656 1743933 1145524 1741801 1162 l +1071670 1744156 1071670 1756948 1162 l +1071670 1756948 1078066 1756948 1162 l +1078066 1756948 1080199 1754816 1162 l +1080199 1754816 1080199 1750551 1162 l +1080199 1750551 1078066 1748420 1162 l +1078066 1748420 1071670 1748420 1162 l +1075934 1748420 1080199 1744156 1162 l +1084509 1744156 1084509 1756948 1162 l +1084509 1756948 1090905 1756948 1162 l +1090905 1756948 1093038 1754816 1162 l +1093038 1754816 1093038 1752684 1162 l +1093038 1752684 1090905 1750551 1162 l +1090905 1750551 1093038 1748420 1162 l +1093038 1748420 1093038 1746288 1162 l +1093038 1746288 1090905 1744156 1162 l +1090905 1744156 1084509 1744156 1162 l +1084509 1750551 1090905 1750551 1162 l +1097349 1756948 1105877 1756948 1162 l +1105877 1756948 1105877 1754816 1162 l +1105877 1754816 1097349 1746288 1162 l +1097349 1746288 1097349 1744156 1162 l +1154231 1750547 1130990 1750547 1394 l +1134825 1765042 1136957 1767174 1162 l +1136957 1767174 1136957 1754382 1162 l +1134825 1754382 1139089 1754382 1162 l +1145524 1765042 1147656 1767174 1162 l +1147656 1767174 1151920 1767174 1162 l +1151920 1767174 1154053 1765042 1162 l +1154053 1765042 1154053 1762910 1162 l +1154053 1762910 1151920 1760778 1162 l +1151920 1760778 1149788 1760778 1162 l +1151920 1760778 1154053 1758646 1162 l +1154053 1758646 1154053 1756514 1162 l +1154053 1756514 1151920 1754382 1162 l +1151920 1754382 1147656 1754382 1162 l +1147656 1754382 1145524 1756514 1162 l +973421 1640743 969157 1640743 1162 l +969157 1640743 967025 1638611 1162 l +967025 1638611 967025 1630083 1162 l +967025 1630083 969157 1627951 1162 l +969157 1627951 973421 1627951 1162 l +973421 1627951 975554 1630083 1162 l +975554 1630083 975554 1638611 1162 l +975554 1638611 973421 1640743 1162 l +988393 1638611 986260 1640743 1162 l +986260 1640743 981996 1640743 1162 l +981996 1640743 979864 1638611 1162 l +979864 1638611 979864 1636479 1162 l +979864 1636479 981996 1634346 1162 l +981996 1634346 986260 1634346 1162 l +986260 1634346 988393 1632215 1162 l +988393 1632215 988393 1630083 1162 l +988393 1630083 986260 1627951 1162 l +986260 1627951 981996 1627951 1162 l +981996 1627951 979864 1630083 1162 l +1001232 1638611 999099 1640743 1162 l +999099 1640743 994836 1640743 1162 l +994836 1640743 992704 1638611 1162 l +992704 1638611 992704 1630083 1162 l +992704 1630083 994836 1627951 1162 l +994836 1627951 999099 1627951 1162 l +999099 1627951 1001232 1630083 1162 l +1014072 1627951 1005543 1627951 1162 l +1005543 1627951 1014072 1636479 1162 l +1014072 1636479 1014072 1638611 1162 l +1014072 1638611 1011939 1640743 1162 l +1011939 1640743 1007675 1640743 1162 l +1007675 1640743 1005543 1638611 1162 l +921821 1634342 945062 1634342 1394 l +918850 1648837 920982 1650969 1162 l +920982 1650969 920982 1638177 1162 l +918850 1638177 923114 1638177 1162 l +938078 1650969 929549 1650969 1162 l +929549 1650969 929549 1644573 1162 l +929549 1644573 933813 1646705 1162 l +933813 1646705 935945 1646705 1162 l +935945 1646705 938078 1644573 1162 l +938078 1644573 938078 1640309 1162 l +938078 1640309 935945 1638177 1162 l +935945 1638177 931681 1638177 1162 l +931681 1638177 929549 1640309 1162 l +967025 1454815 967025 1446287 1162 l +967025 1446287 971289 1442023 1162 l +971289 1442023 975554 1446287 1162 l +975554 1446287 975554 1454815 1162 l +988393 1452683 986260 1454815 1162 l +986260 1454815 981996 1454815 1162 l +981996 1454815 979864 1452683 1162 l +979864 1452683 979864 1450551 1162 l +979864 1450551 981996 1448418 1162 l +981996 1448418 986260 1448418 1162 l +986260 1448418 988393 1446287 1162 l +988393 1446287 988393 1444155 1162 l +988393 1444155 986260 1442023 1162 l +986260 1442023 981996 1442023 1162 l +981996 1442023 979864 1444155 1162 l +1001232 1452683 999099 1454815 1162 l +999099 1454815 994836 1454815 1162 l +994836 1454815 992704 1452683 1162 l +992704 1452683 992704 1450551 1162 l +992704 1450551 994836 1448418 1162 l +994836 1448418 999099 1448418 1162 l +999099 1448418 1001232 1446287 1162 l +1001232 1446287 1001232 1444155 1162 l +1001232 1444155 999099 1442023 1162 l +999099 1442023 994836 1442023 1162 l +994836 1442023 992704 1444155 1162 l +921821 1448414 945062 1448414 1394 l +938079 1465041 929550 1465041 1162 l +929550 1465041 929550 1458645 1162 l +929550 1458645 933814 1460777 1162 l +933814 1460777 935946 1460777 1162 l +935946 1460777 938079 1458645 1162 l +938079 1458645 938079 1454381 1162 l +938079 1454381 935946 1452249 1162 l +935946 1452249 931682 1452249 1162 l +931682 1452249 929550 1454381 1162 l +967025 1756948 967025 1748420 1162 l +967025 1748420 971289 1744156 1162 l +971289 1744156 975554 1748420 1162 l +975554 1748420 975554 1756948 1162 l +979864 1756948 979864 1744156 1162 l +979864 1744156 986260 1744156 1162 l +986260 1744156 988393 1746288 1162 l +988393 1746288 988393 1754816 1162 l +988393 1754816 986260 1756948 1162 l +986260 1756948 979864 1756948 1162 l +992704 1756948 992704 1744156 1162 l +992704 1744156 999099 1744156 1162 l +999099 1744156 1001232 1746288 1162 l +1001232 1746288 1001232 1754816 1162 l +1001232 1754816 999099 1756948 1162 l +999099 1756948 992704 1756948 1162 l +921821 1750547 945062 1750547 1394 l +918850 1765042 920982 1767174 1162 l +920982 1767174 920982 1754382 1162 l +918850 1754382 923114 1754382 1162 l +935945 1754382 935945 1767174 1162 l +935945 1767174 929549 1760778 1162 l +929549 1760778 938078 1760778 1162 l +1130990 1425173 945062 1425173 3719 l +945062 1425173 945062 1773788 3719 l +945062 1773788 1130990 1773788 3719 l +1130990 1773788 1130990 1425173 3719 l +945760 1786106 950722 1786106 1394 l +948240 1786106 948240 1800992 1394 l +945760 1800992 950722 1800992 1394 l +968166 1798511 965685 1800992 1394 l +965685 1800992 960723 1800992 1394 l +960723 1800992 958242 1798511 1394 l +958242 1798511 958242 1788586 1394 l +958242 1788586 960723 1786106 1394 l +960723 1786106 965685 1786106 1394 l +965685 1786106 968166 1788586 1394 l +973221 1798511 975702 1800992 1394 l +975702 1800992 975702 1786106 1394 l +973221 1786106 978183 1786106 1394 l +945760 1402629 945760 1417515 1394 l +945760 1417515 953202 1417515 1394 l +953202 1417515 955684 1415035 1394 l +955684 1415035 955684 1410072 1394 l +955684 1410072 953202 1407591 1394 l +953202 1407591 945760 1407591 1394 l +960739 1402629 965701 1402629 1394 l +963220 1402629 963220 1417515 1394 l +960739 1417515 965701 1417515 1394 l +983146 1415035 980664 1417515 1394 l +980664 1417515 975702 1417515 1394 l +975702 1417515 973221 1415035 1394 l +973221 1415035 973221 1405110 1394 l +973221 1405110 975702 1402629 1394 l +975702 1402629 980664 1402629 1394 l +980664 1402629 983146 1405110 1394 l +988201 1415035 990681 1417515 1394 l +990681 1417515 990681 1402629 1394 l +988201 1402629 993163 1402629 1394 l +1010607 1417515 1005645 1415035 1394 l +1005645 1415035 1000683 1410072 1394 l +1000683 1410072 1000683 1405110 1394 l +1000683 1405110 1003164 1402629 1394 l +1003164 1402629 1008126 1402629 1394 l +1008126 1402629 1010607 1405110 1394 l +1010607 1405110 1010607 1407591 1394 l +1010607 1407591 1008126 1410072 1394 l +1008126 1410072 1000683 1410072 1394 l +1015663 1402629 1015663 1417515 1394 l +1015663 1417515 1025587 1417515 1394 l +1015663 1410072 1020625 1410072 1394 l +1030642 1415035 1033123 1417515 1394 l +1033123 1417515 1038085 1417515 1394 l +1038085 1417515 1040566 1415035 1394 l +1040566 1415035 1040566 1412553 1394 l +1040566 1412553 1038085 1410072 1394 l +1038085 1410072 1040566 1407591 1394 l +1040566 1407591 1040566 1405110 1394 l +1040566 1405110 1038085 1402629 1394 l +1038085 1402629 1033123 1402629 1394 l +1033123 1402629 1030642 1405110 1394 l +1030642 1405110 1030642 1407591 1394 l +1030642 1407591 1033123 1410072 1394 l +1033123 1410072 1030642 1412553 1394 l +1030642 1412553 1030642 1415035 1394 l +1033123 1410072 1038085 1410072 1394 l +1053064 1402629 1053064 1417515 1394 l +1053064 1417515 1045622 1410072 1394 l +1045622 1410072 1055546 1410072 1394 l +1060601 1402629 1060601 1412553 1394 l +1060601 1412553 1065563 1417515 1394 l +1065563 1417515 1070525 1412553 1394 l +1070525 1412553 1070525 1402629 1394 l +1060601 1410072 1070525 1410072 1394 l +1075581 1402629 1075581 1417515 1394 l +1075581 1417515 1083023 1417515 1394 l +1083023 1417515 1085505 1415035 1394 l +1085505 1415035 1085505 1410072 1394 l +1085505 1410072 1083023 1407591 1394 l +1083023 1407591 1075581 1407591 1394 l +828857 1750547 828857 1773788 1394 l +828857 1843511 828857 1820270 1394 l +828857 1820270 838154 1816784 1859 l +838154 1816784 819561 1810973 1859 l +819561 1810973 838154 1805163 1859 l +838154 1805163 819561 1799353 1859 l +819561 1799353 838154 1793543 1859 l +838154 1793543 819561 1787732 1859 l +819561 1787732 838154 1781922 1859 l +838154 1781922 819561 1776112 1859 l +819561 1776112 828857 1773788 1859 l +843267 1809347 843267 1824233 1394 l +843267 1824233 850709 1824233 1394 l +850709 1824233 853191 1821752 1394 l +853191 1821752 853191 1816789 1394 l +853191 1816789 850709 1814309 1394 l +850709 1814309 843267 1814309 1394 l +848229 1814309 853191 1809347 1394 l +858246 1821752 860727 1824233 1394 l +860727 1824233 860727 1809347 1394 l +858246 1809347 863208 1809347 1394 l +845823 1775270 848304 1777751 1394 l +848304 1777751 848304 1762865 1394 l +845823 1762865 850785 1762865 1394 l +858306 1777751 858306 1762865 1394 l +858306 1767827 868230 1777751 1394 l +860786 1770307 868230 1762865 1394 l +735893 1843511 735893 1820270 1394 l +735893 1750547 735893 1773788 1394 l +735893 1773788 726597 1777274 1859 l +726597 1777274 745190 1783084 1859 l +745190 1783084 726597 1788895 1859 l +726597 1788895 745190 1794705 1859 l +745190 1794705 726597 1800515 1859 l +726597 1800515 745190 1806325 1859 l +745190 1806325 726597 1812136 1859 l +726597 1812136 745190 1817946 1859 l +745190 1817946 735893 1820270 1859 l +692919 1816319 692919 1831205 1394 l +692919 1831205 700361 1831205 1394 l +700361 1831205 702843 1828724 1394 l +702843 1828724 702843 1823762 1394 l +702843 1823762 700361 1821281 1394 l +700361 1821281 692919 1821281 1394 l +697881 1821281 702843 1816319 1394 l +717822 1816319 707898 1816319 1394 l +707898 1816319 717822 1826243 1394 l +717822 1826243 717822 1828724 1394 l +717822 1828724 715341 1831205 1394 l +715341 1831205 710379 1831205 1394 l +710379 1831205 707898 1828724 1394 l +745042 1755672 735118 1755672 1394 l +735118 1755672 735118 1748228 1394 l +735118 1748228 740080 1750710 1394 l +740080 1750710 742561 1750710 1394 l +742561 1750710 745042 1748228 1394 l +745042 1748228 745042 1743266 1394 l +745042 1743266 742561 1740786 1394 l +742561 1740786 737599 1740786 1394 l +737599 1740786 735118 1743266 1394 l +750098 1740786 750098 1743266 1394 l +750098 1743266 752578 1743266 1394 l +752578 1743266 752578 1740786 1394 l +752578 1740786 750098 1740786 1394 l +762580 1753191 765061 1755672 1394 l +765061 1755672 765061 1740786 1394 l +762580 1740786 767542 1740786 1394 l +775063 1755672 775063 1740786 1394 l +775063 1745748 784987 1755672 1394 l +777543 1748228 784987 1740786 1394 l +1386641 1448414 1433123 1448414 1394 l +1401624 1462909 1403755 1465041 1162 l +1403755 1465041 1403755 1452249 1162 l +1401624 1452249 1405887 1452249 1162 l +1386641 1471655 1433123 1471655 1394 l +1408012 1475490 1399483 1475490 1162 l +1399483 1475490 1408012 1484018 1162 l +1408012 1484018 1408012 1486150 1162 l +1408012 1486150 1405879 1488282 1162 l +1405879 1488282 1401615 1488282 1162 l +1401615 1488282 1399483 1486150 1162 l +1386641 1494896 1433123 1494896 1394 l +1399483 1509391 1401615 1511523 1162 l +1401615 1511523 1405879 1511523 1162 l +1405879 1511523 1408012 1509391 1162 l +1408012 1509391 1408012 1507259 1162 l +1408012 1507259 1405879 1505127 1162 l +1405879 1505127 1403747 1505127 1162 l +1405879 1505127 1408012 1502995 1162 l +1408012 1502995 1408012 1500863 1162 l +1408012 1500863 1405879 1498731 1162 l +1405879 1498731 1401615 1498731 1162 l +1401615 1498731 1399483 1500863 1162 l +1421503 1425173 1467985 1425173 3719 l +1444744 1494896 1433123 1494896 5578 l +1444744 1471655 1433123 1471655 5578 l +1444744 1448414 1433123 1448414 5578 l +1386641 1518137 1433123 1518137 1394 l +1405879 1521972 1405879 1534764 1162 l +1405879 1534764 1399483 1528368 1162 l +1399483 1528368 1408012 1528368 1162 l +1386641 1541378 1433123 1541378 1394 l +1408012 1558005 1399483 1558005 1162 l +1399483 1558005 1399483 1551609 1162 l +1399483 1551609 1403747 1553741 1162 l +1403747 1553741 1405879 1553741 1162 l +1405879 1553741 1408012 1551609 1162 l +1408012 1551609 1408012 1547345 1162 l +1408012 1547345 1405879 1545213 1162 l +1405879 1545213 1401615 1545213 1162 l +1401615 1545213 1399483 1547345 1162 l +1467985 1564619 1467985 1425173 3719 l +1421503 1425173 1421503 1564619 3719 l +1467985 1564619 1421503 1564619 3719 l +1444744 1541378 1433123 1541378 5578 l +1444744 1518137 1433123 1518137 5578 l +1478392 1411705 1473430 1411705 1394 l +1473430 1411705 1470949 1409224 1394 l +1470949 1409224 1470949 1399299 1394 l +1470949 1399299 1473430 1396819 1394 l +1473430 1396819 1478392 1396819 1394 l +1478392 1396819 1480874 1399299 1394 l +1480874 1399299 1480874 1409224 1394 l +1480874 1409224 1478392 1411705 1394 l +1485929 1406743 1485929 1399299 1394 l +1485929 1399299 1488409 1396819 1394 l +1488409 1396819 1495853 1396819 1394 l +1495853 1396819 1495853 1406743 1394 l +1503389 1409224 1503389 1399299 1394 l +1503389 1399299 1505870 1396819 1394 l +1500908 1406743 1505870 1406743 1394 l +1513391 1391857 1513391 1406743 1394 l +1513391 1406743 1520833 1406743 1394 l +1520833 1406743 1523315 1404261 1394 l +1523315 1404261 1523315 1399299 1394 l +1523315 1399299 1520833 1396819 1394 l +1520833 1396819 1513391 1396819 1394 l +1528370 1406743 1528370 1399299 1394 l +1528370 1399299 1530851 1396819 1394 l +1530851 1396819 1538294 1396819 1394 l +1538294 1396819 1538294 1406743 1394 l +1545830 1409224 1545830 1399299 1394 l +1545830 1399299 1548312 1396819 1394 l +1543350 1406743 1548312 1406743 1394 l +1430353 1410386 1427871 1412867 1394 l +1427871 1412867 1422909 1412867 1394 l +1422909 1412867 1420429 1410386 1394 l +1420429 1410386 1420429 1407905 1394 l +1420429 1407905 1422909 1405424 1394 l +1422909 1405424 1427871 1405424 1394 l +1427871 1405424 1430353 1402943 1394 l +1430353 1402943 1430353 1400461 1394 l +1430353 1400461 1427871 1397981 1394 l +1427871 1397981 1422909 1397981 1394 l +1422909 1397981 1420429 1400461 1394 l +1435408 1412867 1435408 1402943 1394 l +1435408 1402943 1440370 1397981 1394 l +1440370 1397981 1445332 1402943 1394 l +1445332 1402943 1445332 1412867 1394 l +1450388 1410386 1452868 1412867 1394 l +1452868 1412867 1452868 1397981 1394 l +1450388 1397981 1455350 1397981 1394 l +1386641 1634342 1433123 1634342 1394 l +1401624 1648837 1403755 1650969 1162 l +1403755 1650969 1403755 1638177 1162 l +1401624 1638177 1405887 1638177 1162 l +1386641 1657583 1433123 1657583 1394 l +1408012 1661418 1399483 1661418 1162 l +1399483 1661418 1408012 1669946 1162 l +1408012 1669946 1408012 1672078 1162 l +1408012 1672078 1405879 1674210 1162 l +1405879 1674210 1401615 1674210 1162 l +1401615 1674210 1399483 1672078 1162 l +1386641 1680824 1433123 1680824 1394 l +1399483 1695319 1401615 1697451 1162 l +1401615 1697451 1405879 1697451 1162 l +1405879 1697451 1408012 1695319 1162 l +1408012 1695319 1408012 1693187 1162 l +1408012 1693187 1405879 1691055 1162 l +1405879 1691055 1403747 1691055 1162 l +1405879 1691055 1408012 1688923 1162 l +1408012 1688923 1408012 1686791 1162 l +1408012 1686791 1405879 1684659 1162 l +1405879 1684659 1401615 1684659 1162 l +1401615 1684659 1399483 1686791 1162 l +1421503 1611101 1467985 1611101 3719 l +1444744 1680824 1433123 1680824 5578 l +1444744 1657583 1433123 1657583 5578 l +1444744 1634342 1433123 1634342 5578 l +1386641 1704065 1433123 1704065 1394 l +1405879 1707900 1405879 1720692 1162 l +1405879 1720692 1399483 1714296 1162 l +1399483 1714296 1408012 1714296 1162 l +1386641 1727306 1433123 1727306 1394 l +1408012 1743933 1399483 1743933 1162 l +1399483 1743933 1399483 1737537 1162 l +1399483 1737537 1403747 1739669 1162 l +1403747 1739669 1405879 1739669 1162 l +1405879 1739669 1408012 1737537 1162 l +1408012 1737537 1408012 1733273 1162 l +1408012 1733273 1405879 1731141 1162 l +1405879 1731141 1401615 1731141 1162 l +1401615 1731141 1399483 1733273 1162 l +1444744 1727306 1433123 1727306 5578 l +1444744 1704065 1433123 1704065 5578 l +1386641 1750547 1433123 1750547 1394 l +1408012 1767174 1403747 1765042 1162 l +1403747 1765042 1399483 1760778 1162 l +1399483 1760778 1399483 1756514 1162 l +1399483 1756514 1401615 1754382 1162 l +1401615 1754382 1405879 1754382 1162 l +1405879 1754382 1408012 1756514 1162 l +1408012 1756514 1408012 1758646 1162 l +1408012 1758646 1405879 1760778 1162 l +1405879 1760778 1399483 1760778 1162 l +1386641 1773788 1433123 1773788 1394 l +1399483 1790415 1408012 1790415 1162 l +1408012 1790415 1408012 1788283 1162 l +1408012 1788283 1399483 1779755 1162 l +1399483 1779755 1399483 1777623 1162 l +1386641 1797029 1433123 1797029 1394 l +1399483 1811524 1401615 1813656 1162 l +1401615 1813656 1405879 1813656 1162 l +1405879 1813656 1408012 1811524 1162 l +1408012 1811524 1408012 1809392 1162 l +1408012 1809392 1405879 1807260 1162 l +1405879 1807260 1408012 1805128 1162 l +1408012 1805128 1408012 1802996 1162 l +1408012 1802996 1405879 1800864 1162 l +1405879 1800864 1401615 1800864 1162 l +1401615 1800864 1399483 1802996 1162 l +1399483 1802996 1399483 1805128 1162 l +1399483 1805128 1401615 1807260 1162 l +1401615 1807260 1399483 1809392 1162 l +1399483 1809392 1399483 1811524 1162 l +1401615 1807260 1405879 1807260 1162 l +1444744 1797029 1433123 1797029 5578 l +1444744 1773788 1433123 1773788 5578 l +1444744 1750547 1433123 1750547 5578 l +1467985 1820270 1467985 1611101 3719 l +1421503 1611101 1421503 1820270 3719 l +1467985 1820270 1421503 1820270 3719 l +1471767 1841664 1471767 1826777 1394 l +1471767 1831739 1481691 1841664 1394 l +1474247 1834220 1481691 1826777 1394 l +1494189 1826777 1489227 1826777 1394 l +1489227 1826777 1486746 1829258 1394 l +1486746 1829258 1486746 1834220 1394 l +1486746 1834220 1489227 1836701 1394 l +1489227 1836701 1494189 1836701 1394 l +1494189 1836701 1496670 1834220 1394 l +1496670 1834220 1496670 1831739 1394 l +1496670 1831739 1486746 1831739 1394 l +1501725 1836701 1501725 1829258 1394 l +1501725 1829258 1504206 1826777 1394 l +1504206 1826777 1511650 1826777 1394 l +1511650 1836701 1511650 1824297 1394 l +1511650 1824297 1509168 1821815 1394 l +1509168 1821815 1506687 1821815 1394 l +1516705 1821815 1516705 1836701 1394 l +1516705 1836701 1524148 1836701 1394 l +1524148 1836701 1526629 1834220 1394 l +1526629 1834220 1526629 1829258 1394 l +1526629 1829258 1524148 1826777 1394 l +1524148 1826777 1516705 1826777 1394 l +1534165 1836701 1539127 1836701 1394 l +1539127 1836701 1541608 1834220 1394 l +1541608 1834220 1541608 1826777 1394 l +1541608 1826777 1534165 1826777 1394 l +1534165 1826777 1531684 1829258 1394 l +1531684 1829258 1534165 1831739 1394 l +1534165 1831739 1541608 1831739 1394 l +1556588 1841664 1556588 1826777 1394 l +1556588 1826777 1549144 1826777 1394 l +1549144 1826777 1546664 1829258 1394 l +1546664 1829258 1546664 1834220 1394 l +1546664 1834220 1549144 1836701 1394 l +1549144 1836701 1556588 1836701 1394 l +1433667 1840345 1431185 1842826 1394 l +1431185 1842826 1426223 1842826 1394 l +1426223 1842826 1423743 1840345 1394 l +1423743 1840345 1423743 1837864 1394 l +1423743 1837864 1426223 1835382 1394 l +1426223 1835382 1431185 1835382 1394 l +1431185 1835382 1433667 1832901 1394 l +1433667 1832901 1433667 1830420 1394 l +1433667 1830420 1431185 1827939 1394 l +1431185 1827939 1426223 1827939 1394 l +1426223 1827939 1423743 1830420 1394 l +1438722 1842826 1438722 1832901 1394 l +1438722 1832901 1443684 1827939 1394 l +1443684 1827939 1448646 1832901 1394 l +1448646 1832901 1448646 1842826 1394 l +1463626 1827939 1453702 1827939 1394 l +1453702 1827939 1463626 1837864 1394 l +1463626 1837864 1463626 1840345 1394 l +1463626 1840345 1461144 1842826 1394 l +1461144 1842826 1456182 1842826 1394 l +1456182 1842826 1453702 1840345 1394 l +642929 1866752 596447 1866752 1394 l +618410 1881247 620542 1883379 1162 l +620542 1883379 620542 1870587 1162 l +618410 1870587 622674 1870587 1162 l +642929 1889993 596447 1889993 1394 l +626939 1893828 618410 1893828 1162 l +618410 1893828 626939 1902356 1162 l +626939 1902356 626939 1904488 1162 l +626939 1904488 624806 1906620 1162 l +624806 1906620 620542 1906620 1162 l +620542 1906620 618410 1904488 1162 l +642929 1913234 596447 1913234 1394 l +618410 1927729 620542 1929861 1162 l +620542 1929861 624806 1929861 1162 l +624806 1929861 626939 1927729 1162 l +626939 1927729 626939 1925597 1162 l +626939 1925597 624806 1923465 1162 l +624806 1923465 622674 1923465 1162 l +624806 1923465 626939 1921333 1162 l +626939 1921333 626939 1919201 1162 l +626939 1919201 624806 1917069 1162 l +624806 1917069 620542 1917069 1162 l +620542 1917069 618410 1919201 1162 l +608068 1843511 561586 1843511 3719 l +562283 1820967 562283 1835853 1394 l +562283 1835853 569726 1835853 1394 l +569726 1835853 572207 1833373 1394 l +572207 1833373 572207 1828410 1394 l +572207 1828410 569726 1825929 1394 l +569726 1825929 562283 1825929 1394 l +579743 1820967 584705 1820967 1394 l +584705 1820967 587187 1823448 1394 l +587187 1823448 587187 1828410 1394 l +587187 1828410 584705 1830891 1394 l +584705 1830891 579743 1830891 1394 l +579743 1830891 577263 1828410 1394 l +577263 1828410 577263 1823448 1394 l +577263 1823448 579743 1820967 1394 l +592242 1830891 592242 1823448 1394 l +592242 1823448 594723 1820967 1394 l +594723 1820967 597204 1823448 1394 l +597204 1823448 599685 1820967 1394 l +599685 1820967 602166 1823448 1394 l +602166 1823448 602166 1830891 1394 l +614664 1820967 609702 1820967 1394 l +609702 1820967 607221 1823448 1394 l +607221 1823448 607221 1828410 1394 l +607221 1828410 609702 1830891 1394 l +609702 1830891 614664 1830891 1394 l +614664 1830891 617146 1828410 1394 l +617146 1828410 617146 1825929 1394 l +617146 1825929 607221 1825929 1394 l +622201 1820967 622201 1830891 1394 l +622201 1825929 627163 1830891 1394 l +627163 1830891 629644 1830891 1394 l +584827 1913234 596447 1913234 5578 l +584827 1889993 596447 1889993 5578 l +584827 1866752 596447 1866752 5578 l +561586 1936475 561586 1843511 3719 l +608068 1843511 608068 1936475 3719 l +572207 1956550 569726 1959031 1394 l +569726 1959031 564764 1959031 1394 l +564764 1959031 562283 1956550 1394 l +562283 1956550 562283 1954069 1394 l +562283 1954069 564764 1951587 1394 l +564764 1951587 569726 1951587 1394 l +569726 1951587 572207 1949106 1394 l +572207 1949106 572207 1946625 1394 l +572207 1946625 569726 1944144 1394 l +569726 1944144 564764 1944144 1394 l +564764 1944144 562283 1946625 1394 l +577263 1959031 577263 1949106 1394 l +577263 1949106 582225 1944144 1394 l +582225 1944144 587187 1949106 1394 l +587187 1949106 587187 1959031 1394 l +592242 1956550 594723 1959031 1394 l +594723 1959031 599685 1959031 1394 l +599685 1959031 602166 1956550 1394 l +602166 1956550 602166 1954069 1394 l +602166 1954069 599685 1951587 1394 l +599685 1951587 597204 1951587 1394 l +599685 1951587 602166 1949106 1394 l +602166 1949106 602166 1946625 1394 l +602166 1946625 599685 1944144 1394 l +599685 1944144 594723 1944144 1394 l +594723 1944144 592242 1946625 1394 l +561586 1936475 608068 1936475 3719 l +1107749 1889993 1084508 1889993 1394 l +1027103 1904402 1027103 1919288 1394 l +1027103 1919288 1034546 1919288 1394 l +1034546 1919288 1037027 1916808 1394 l +1037027 1916808 1037027 1911845 1394 l +1037027 1911845 1034546 1909364 1394 l +1034546 1909364 1027103 1909364 1394 l +1032065 1909364 1037027 1904402 1394 l +1042083 1916808 1044563 1919288 1394 l +1044563 1919288 1049525 1919288 1394 l +1049525 1919288 1052007 1916808 1394 l +1052007 1916808 1052007 1914326 1394 l +1052007 1914326 1049525 1911845 1394 l +1049525 1911845 1047045 1911845 1394 l +1049525 1911845 1052007 1909364 1394 l +1052007 1909364 1052007 1906883 1394 l +1052007 1906883 1049525 1904402 1394 l +1049525 1904402 1044563 1904402 1394 l +1044563 1904402 1042083 1906883 1394 l +1027103 1872882 1029584 1875363 1394 l +1029584 1875363 1029584 1860477 1394 l +1027103 1860477 1032065 1860477 1394 l +1039585 1862957 1039585 1872882 1394 l +1039585 1872882 1042066 1875363 1394 l +1042066 1875363 1047028 1875363 1394 l +1047028 1875363 1049510 1872882 1394 l +1049510 1872882 1049510 1862957 1394 l +1049510 1862957 1047028 1860477 1394 l +1047028 1860477 1042066 1860477 1394 l +1042066 1860477 1039585 1862957 1394 l +1039585 1862957 1049510 1872882 1394 l +1054565 1875363 1054565 1860477 1394 l +1054565 1865439 1064489 1875363 1394 l +1057046 1867919 1064489 1860477 1394 l +1014785 1889993 1038026 1889993 1394 l +1038026 1889993 1041512 1899289 1859 l +1041512 1899289 1047323 1880696 1859 l +1047323 1880696 1053133 1899289 1859 l +1053133 1899289 1058943 1880696 1859 l +1058943 1880696 1064753 1899289 1859 l +1064753 1899289 1070564 1880696 1859 l +1070564 1880696 1076374 1899289 1859 l +1076374 1899289 1082184 1880696 1859 l +1082184 1880696 1084508 1889993 1859 l +1200713 1308968 1200713 1262486 1394 l +1186218 1284449 1184086 1286581 1162 l +1184086 1286581 1196879 1286581 1162 l +1196879 1284449 1196879 1288713 1162 l +1177472 1308968 1177472 1262486 1394 l +1173638 1292977 1173638 1284449 1162 l +1173638 1284449 1165109 1292977 1162 l +1165109 1292977 1162977 1292977 1162 l +1162977 1292977 1160845 1290844 1162 l +1160845 1290844 1160845 1286581 1162 l +1160845 1286581 1162977 1284449 1162 l +1154231 1308968 1154231 1262486 1394 l +1139736 1284449 1137604 1286581 1162 l +1137604 1286581 1137604 1290844 1162 l +1137604 1290844 1139736 1292977 1162 l +1139736 1292977 1141868 1292977 1162 l +1141868 1292977 1144001 1290844 1162 l +1144001 1290844 1144001 1288713 1162 l +1144001 1290844 1146133 1292977 1162 l +1146133 1292977 1148265 1292977 1162 l +1148265 1292977 1150397 1290844 1162 l +1150397 1290844 1150397 1286581 1162 l +1150397 1286581 1148265 1284449 1162 l +1223954 1274106 1223954 1227624 3719 l +1154231 1250865 1154231 1262486 5578 l +1177472 1250865 1177472 1262486 5578 l +1200713 1250865 1200713 1262486 5578 l +1130990 1227624 1223954 1227624 3719 l +1223954 1274106 1130990 1274106 3719 l +1130990 1227624 1130990 1274106 3719 l +1099572 1201217 1097090 1203698 1394 l +1097090 1203698 1092128 1203698 1394 l +1092128 1203698 1089648 1201217 1394 l +1089648 1201217 1089648 1198736 1394 l +1089648 1198736 1092128 1196255 1394 l +1092128 1196255 1097090 1196255 1394 l +1097090 1196255 1099572 1193774 1394 l +1099572 1193774 1099572 1191292 1394 l +1099572 1191292 1097090 1188812 1394 l +1097090 1188812 1092128 1188812 1394 l +1092128 1188812 1089648 1191292 1394 l +1112070 1188812 1107108 1188812 1394 l +1107108 1188812 1104627 1191292 1394 l +1104627 1191292 1104627 1196255 1394 l +1104627 1196255 1107108 1198736 1394 l +1107108 1198736 1112070 1198736 1394 l +1112070 1198736 1114551 1196255 1394 l +1114551 1196255 1114551 1193774 1394 l +1114551 1193774 1104627 1193774 1394 l +1119607 1188812 1119607 1198736 1394 l +1119607 1193774 1124569 1198736 1394 l +1124569 1198736 1127049 1198736 1394 l +1134586 1188812 1144510 1203698 1394 l +1149566 1188812 1149566 1203698 1394 l +1149566 1203698 1157008 1203698 1394 l +1157008 1203698 1159490 1201217 1394 l +1159490 1201217 1159490 1196255 1394 l +1159490 1196255 1157008 1193774 1394 l +1157008 1193774 1149566 1193774 1394 l +1167026 1198736 1171988 1198736 1394 l +1171988 1198736 1174469 1196255 1394 l +1174469 1196255 1174469 1188812 1394 l +1174469 1188812 1167026 1188812 1394 l +1167026 1188812 1164545 1191292 1394 l +1164545 1191292 1167026 1193774 1394 l +1167026 1193774 1174469 1193774 1394 l +1179525 1188812 1179525 1198736 1394 l +1179525 1193774 1184487 1198736 1394 l +1184487 1198736 1186967 1198736 1394 l +1219408 1201217 1216926 1203698 1394 l +1216926 1203698 1211964 1203698 1394 l +1211964 1203698 1209484 1201217 1394 l +1209484 1201217 1209484 1198736 1394 l +1209484 1198736 1211964 1196255 1394 l +1211964 1196255 1216926 1196255 1394 l +1216926 1196255 1219408 1193774 1394 l +1219408 1193774 1219408 1191292 1394 l +1219408 1191292 1216926 1188812 1394 l +1216926 1188812 1211964 1188812 1394 l +1211964 1188812 1209484 1191292 1394 l +1231906 1188812 1226944 1188812 1394 l +1226944 1188812 1224463 1191292 1394 l +1224463 1191292 1224463 1196255 1394 l +1224463 1196255 1226944 1198736 1394 l +1226944 1198736 1231906 1198736 1394 l +1231906 1198736 1234387 1196255 1394 l +1234387 1196255 1234387 1193774 1394 l +1234387 1193774 1224463 1193774 1394 l +1239443 1203698 1241923 1203698 1394 l +1241923 1203698 1241923 1188812 1394 l +1239443 1188812 1244405 1188812 1394 l +1259368 1188812 1254406 1188812 1394 l +1254406 1188812 1251925 1191292 1394 l +1251925 1191292 1251925 1196255 1394 l +1251925 1196255 1254406 1198736 1394 l +1254406 1198736 1259368 1198736 1394 l +1259368 1198736 1261849 1196255 1394 l +1261849 1196255 1261849 1193774 1394 l +1261849 1193774 1251925 1193774 1394 l +1276829 1198736 1269385 1198736 1394 l +1269385 1198736 1266904 1196255 1394 l +1266904 1196255 1266904 1191292 1394 l +1266904 1191292 1269385 1188812 1394 l +1269385 1188812 1276829 1188812 1394 l +1284364 1201217 1284364 1191292 1394 l +1284364 1191292 1286846 1188812 1394 l +1281884 1198736 1286846 1198736 1394 l +1066459 1270940 1063978 1273421 1394 l +1063978 1273421 1059016 1273421 1394 l +1059016 1273421 1056535 1270940 1394 l +1056535 1270940 1056535 1268459 1394 l +1056535 1268459 1059016 1265978 1394 l +1059016 1265978 1063978 1265978 1394 l +1063978 1265978 1066459 1263497 1394 l +1066459 1263497 1066459 1261015 1394 l +1066459 1261015 1063978 1258535 1394 l +1063978 1258535 1059016 1258535 1394 l +1059016 1258535 1056535 1261015 1394 l +1071514 1273421 1071514 1263497 1394 l +1071514 1263497 1076476 1258535 1394 l +1076476 1258535 1081439 1263497 1394 l +1081439 1263497 1081439 1273421 1394 l +1093936 1258535 1093936 1273421 1394 l +1093936 1273421 1086494 1265978 1394 l +1086494 1265978 1096418 1265978 1394 l +712652 1564619 759134 1564619 2324 l +735893 1555322 735893 1541378 1394 l +735892 1518373 37096 2324 52.12 90.00 0 a +735893 1518137 37185 2324 90.00 127.37 0 a +735893 1587860 735893 1564619 1394 l +735893 1518137 735893 1541378 1394 l +755811 1583532 753330 1586013 1394 l +753330 1586013 748368 1586013 1394 l +748368 1586013 745887 1583532 1394 l +745887 1583532 745887 1573607 1394 l +745887 1573607 748368 1571126 1394 l +748368 1571126 753330 1571126 1394 l +753330 1571126 755811 1573607 1394 l +770791 1571126 760866 1571126 1394 l +760866 1571126 770791 1581050 1394 l +770791 1581050 770791 1583532 1394 l +770791 1583532 768309 1586013 1394 l +768309 1586013 763347 1586013 1394 l +763347 1586013 760866 1583532 1394 l +745887 1539374 748368 1541855 1394 l +748368 1541855 748368 1526968 1394 l +745887 1526968 750849 1526968 1394 l +758369 1529449 758369 1539374 1394 l +758369 1539374 760850 1541855 1394 l +760850 1541855 765812 1541855 1394 l +765812 1541855 768293 1539374 1394 l +768293 1539374 768293 1529449 1394 l +768293 1529449 765812 1526968 1394 l +765812 1526968 760850 1526968 1394 l +760850 1526968 758369 1529449 1394 l +758369 1529449 768293 1539374 1394 l +773349 1529449 773349 1539374 1394 l +773349 1539374 775829 1541855 1394 l +775829 1541855 780791 1541855 1394 l +780791 1541855 783273 1539374 1394 l +783273 1539374 783273 1529449 1394 l +783273 1529449 780791 1526968 1394 l +780791 1526968 775829 1526968 1394 l +775829 1526968 773349 1529449 1394 l +773349 1529449 783273 1539374 1394 l +788328 1522006 788328 1536893 1394 l +788328 1536893 795771 1536893 1394 l +795771 1536893 798252 1534411 1394 l +798252 1534411 798252 1529449 1394 l +798252 1529449 795771 1526968 1394 l +795771 1526968 788328 1526968 1394 l +805788 1526968 805788 1539374 1394 l +805788 1539374 808270 1541855 1394 l +803308 1534411 808270 1534411 1394 l +526724 1564619 573206 1564619 2324 l +549965 1555322 549965 1541378 1394 l +549964 1518373 37096 2324 52.12 90.00 0 a +549965 1518137 37185 2324 90.00 127.37 0 a +549965 1587860 549965 1564619 1394 l +549965 1518137 549965 1541378 1394 l +569883 1583532 567402 1586013 1394 l +567402 1586013 562440 1586013 1394 l +562440 1586013 559959 1583532 1394 l +559959 1583532 559959 1573607 1394 l +559959 1573607 562440 1571126 1394 l +562440 1571126 567402 1571126 1394 l +567402 1571126 569883 1573607 1394 l +574938 1583532 577419 1586013 1394 l +577419 1586013 582381 1586013 1394 l +582381 1586013 584863 1583532 1394 l +584863 1583532 584863 1581050 1394 l +584863 1581050 582381 1578569 1394 l +582381 1578569 579900 1578569 1394 l +582381 1578569 584863 1576088 1394 l +584863 1576088 584863 1573607 1394 l +584863 1573607 582381 1571126 1394 l +582381 1571126 577419 1571126 1394 l +577419 1571126 574938 1573607 1394 l +596447 1564619 642929 1564619 2324 l +619688 1555322 619688 1541378 1394 l +619687 1518373 37096 2324 52.12 90.00 0 a +619688 1518137 37185 2324 90.00 127.37 0 a +619688 1587860 619688 1564619 1394 l +619688 1518137 619688 1541378 1394 l +639606 1583532 637125 1586013 1394 l +637125 1586013 632163 1586013 1394 l +632163 1586013 629682 1583532 1394 l +629682 1583532 629682 1573607 1394 l +629682 1573607 632163 1571126 1394 l +632163 1571126 637125 1571126 1394 l +637125 1571126 639606 1573607 1394 l +652104 1571126 652104 1586013 1394 l +652104 1586013 644661 1578569 1394 l +644661 1578569 654586 1578569 1394 l +597145 1693298 597145 1703223 1394 l +597145 1703223 599625 1705704 1394 l +599625 1705704 604587 1705704 1394 l +604587 1705704 607069 1703223 1394 l +607069 1703223 607069 1693298 1394 l +607069 1693298 604587 1690818 1394 l +604587 1690818 599625 1690818 1394 l +599625 1690818 597145 1693298 1394 l +602107 1695780 607069 1690818 1394 l +612124 1703223 614605 1705704 1394 l +614605 1705704 614605 1690818 1394 l +612124 1690818 617086 1690818 1394 l +582503 1680824 596447 1680824 1394 l +549965 1680824 563910 1680824 1394 l +569720 1694768 569720 1666879 2324 l +569720 1666879 576692 1666879 2324 l +576692 1666879 576692 1694768 2324 l +576692 1694768 569720 1694768 2324 l +582503 1697093 582503 1664555 2324 l +563910 1697093 563910 1664555 2324 l +875339 1541378 921821 1541378 2324 l +898580 1532081 898580 1518137 1394 l +898579 1495132 37096 2324 52.12 90.00 0 a +898580 1494896 37185 2324 90.00 127.37 0 a +898580 1564619 898580 1541378 1394 l +898580 1494896 898580 1518137 1394 l +918498 1560291 916017 1562772 1394 l +916017 1562772 911055 1562772 1394 l +911055 1562772 908574 1560291 1394 l +908574 1560291 908574 1550366 1394 l +908574 1550366 911055 1547885 1394 l +911055 1547885 916017 1547885 1394 l +916017 1547885 918498 1550366 1394 l +923553 1560291 926034 1562772 1394 l +926034 1562772 926034 1547885 1394 l +923553 1547885 928515 1547885 1394 l +838851 1480486 838851 1482967 1394 l +838851 1482967 841332 1482967 1394 l +841332 1482967 841332 1480486 1394 l +841332 1480486 838851 1480486 1394 l +851333 1482967 851333 1492892 1394 l +851333 1492892 853814 1495373 1394 l +853814 1495373 858776 1495373 1394 l +858776 1495373 861257 1492892 1394 l +861257 1492892 861257 1482967 1394 l +861257 1482967 858776 1480486 1394 l +858776 1480486 853814 1480486 1394 l +853814 1480486 851333 1482967 1394 l +851333 1482967 861257 1492892 1394 l +866313 1492892 868793 1495373 1394 l +868793 1495373 868793 1480486 1394 l +866313 1480486 871275 1480486 1394 l +878795 1490411 878795 1482967 1394 l +878795 1482967 881276 1480486 1394 l +881276 1480486 888719 1480486 1394 l +888719 1480486 888719 1490411 1394 l +896255 1480486 896255 1492892 1394 l +896255 1492892 898737 1495373 1394 l +893775 1487929 898737 1487929 1394 l +735893 1750547 735893 1680824 1394 l +921821 1680824 735893 1680824 1394 l +735893 1587860 735893 1680824 1394 l +735893 1680824 9296 p +596447 1680824 619688 1680824 1394 l +619688 1680824 735893 1680824 1394 l +619688 1587860 619688 1680824 1394 l +619688 1680824 9296 p +828857 1750547 828857 1587860 1394 l +828857 1587860 921821 1587860 1394 l +1154231 1448414 1386641 1448414 1394 l +1154231 1471655 1386641 1471655 1394 l +1154231 1494896 1386641 1494896 1394 l +1154231 1518137 1386641 1518137 1394 l +1154231 1541378 1177472 1541378 1394 l +1177472 1541378 1386641 1541378 1394 l +1107749 1889993 1177472 1889993 1394 l +1177472 1889993 1177472 1541378 1394 l +1177472 1541378 9296 p +1177472 1541378 1177472 1308968 1394 l +1154231 1587860 1386641 1587860 1394 l +1386641 1587860 1386641 1634342 1394 l +1154231 1611101 1363400 1611101 1394 l +1363400 1611101 1363400 1657583 1394 l +1363400 1657583 1386641 1657583 1394 l +1154231 1634342 1340159 1634342 1394 l +1340159 1634342 1340159 1680824 1394 l +1340159 1680824 1386641 1680824 1394 l +1154231 1657583 1316918 1657583 1394 l +1316918 1657583 1316918 1704065 1394 l +1316918 1704065 1386641 1704065 1394 l +1154231 1680824 1293677 1680824 1394 l +1293677 1680824 1293677 1727306 1394 l +1293677 1727306 1386641 1727306 1394 l +1154231 1704065 1270436 1704065 1394 l +1270436 1704065 1270436 1750547 1394 l +1270436 1750547 1386641 1750547 1394 l +1154231 1727306 1247195 1727306 1394 l +1247195 1727306 1247195 1773788 1394 l +1247195 1773788 1386641 1773788 1394 l +1154231 1750547 1223954 1750547 1394 l +1223954 1750547 1223954 1797029 1394 l +1223954 1797029 1386641 1797029 1394 l +735893 1843511 735893 1889993 1394 l +735893 1889993 828857 1889993 1394 l +828857 1889993 898580 1889993 1394 l +898580 1889993 921821 1889993 1394 l +921821 1889993 921821 1750547 1394 l +828857 1843511 828857 1889993 1394 l +828857 1889993 9296 p +642929 1889993 735893 1889993 1394 l +735893 1889993 9296 p +1014785 1889993 921821 1889993 1394 l +921821 1889993 9296 p +898580 1564619 898580 1889993 1394 l +898580 1889993 9296 p +549965 1680824 549965 1634342 1394 l +549965 1634342 549965 1587860 1394 l +549965 1634342 921821 1634342 1394 l +549965 1634342 9296 p +549965 1518137 549965 1448414 1394 l +666170 1866752 642929 1866752 1394 l +642929 1913234 666170 1913234 1394 l +666170 1913234 666170 1866752 1394 l +666170 1866752 666170 1448414 1394 l +666170 1866752 9296 p +666170 1448414 735893 1448414 1394 l +735893 1448414 898580 1448414 1394 l +898580 1448414 921821 1448414 1394 l +898580 1448414 9296 p +898580 1448414 898580 1332209 1394 l +898580 1332209 1154231 1332209 1394 l +1154231 1332209 1154231 1308968 1394 l +735893 1518137 735893 1448414 1394 l +735893 1448414 9296 p +898580 1494896 898580 1448414 1394 l +549965 1448414 619688 1448414 1394 l +619688 1448414 666170 1448414 1394 l +666170 1448414 9296 p +619688 1518137 619688 1448414 1394 l +619688 1448414 9296 p +showpage grestore diff --git a/keypad.sch b/keypad.sch new file mode 100644 index 0000000..eb7651b --- /dev/null +++ b/keypad.sch Binary files differ diff --git a/keypad.xrf b/keypad.xrf new file mode 100644 index 0000000..3d47921 --- /dev/null +++ b/keypad.xrf @@ -0,0 +1,185 @@ +MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 1 + + MPASM Cross Reference File + +LABEL TYPE FILE NAME SOURCE FILE REFERENCES +----- ---- --------- ---------------------- + +C C P16F84A.INC 76* +CLK_TIME C KEYPAD.ASM 78* 354. +DC C P16F84A.INC 75* +DEBOUNCE_COUNT C KEYPAD.ASM 76* 385. +DEBOUNCE_TIME C KEYPAD.ASM 77* 388. +EEADR C P16F84A.INC 57* +EECON1 C P16F84A.INC 64* +EECON2 C P16F84A.INC 65* +EEDATA C P16F84A.INC 56* +EEIE C P16F84A.INC 81* +EEIF C P16F84A.INC 102* +F C P16F84A.INC 45* +FSR C KEYPAD.ASM 134. 165. + P16F84A.INC 53* +GIE C KEYPAD.ASM 543. + P16F84A.INC 80* +INCFILES M KEYPAD.ASM 0* +INDF C P16F84A.INC 49* +INTCON C KEYPAD.ASM 142. 148. 485. 542. 543. + P16F84A.INC 59* +INTE C P16F84A.INC 83* +INTEDG C P16F84A.INC 92* +INTF C P16F84A.INC 86* +IRP C P16F84A.INC 69* +KEYPAD C KEYPAD.ASM 42* 196. 197. 382. 390. 531. +LATCH_TIME C KEYPAD.ASM 81* 338. 366. +MAX_COL C KEYPAD.ASM 79* 187. +NOT_PD C P16F84A.INC 73* +NOT_RBPU C P16F84A.INC 91* +NOT_TO C P16F84A.INC 72* +NO_HIT C KEYPAD.ASM 80* 199. 204. +OPTION_REG C KEYPAD.ASM 516. 519. + P16F84A.INC 61* +OUTPUT C KEYPAD.ASM 43* 336. 337. 340. 348. 351. 353. 356. 365. 368. 491. 530. +PAR_SEL C KEYPAD.ASM 44* 491. +PCL C KEYPAD.ASM 248. 263. 269. 275. 281. 294. 428. + P16F84A.INC 51* +PCLATH C KEYPAD.ASM 136. 138. 163. + P16F84A.INC 58* +PLATCH C KEYPAD.ASM 45* 337. 340. +PORTA C KEYPAD.ASM 43. + P16F84A.INC 54* +PORTB C KEYPAD.ASM 42. + P16F84A.INC 55* +PS0 C P16F84A.INC 98* +PS1 C P16F84A.INC 97* +PS2 C P16F84A.INC 96* +PSA C P16F84A.INC 95* +RBIE C P16F84A.INC 84* +RBIF C P16F84A.INC 87* +RD C P16F84A.INC 106* +REPEAT_COUNT C KEYPAD.ASM 82* 214. + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 2 + + MPASM Cross Reference File + +LABEL TYPE FILE NAME SOURCE FILE REFERENCES +----- ---- --------- ---------------------- + +REPEAT_DELAY C KEYPAD.ASM 84* 217. +RP0 C KEYPAD.ASM 132. 496. 505. 521. + P16F84A.INC 71* +RP1 C KEYPAD.ASM 131. + P16F84A.INC 70* +SCLK C KEYPAD.ASM 46* 353. 356. +SDAT C KEYPAD.ASM 47* 348. 351. +SLATCH C KEYPAD.ASM 48* 365. 368. +STATUS C KEYPAD.ASM 130. 131. 132. 156. 167. 189. 200. 205. 330. 358. 392. 472. 496. + 505. 521. + P16F84A.INC 52* +T0CS C P16F84A.INC 93* +T0IE C KEYPAD.ASM 542. + P16F84A.INC 82* +T0IF C KEYPAD.ASM 142. 148. + P16F84A.INC 85* +T0SE C P16F84A.INC 94* +TMR0 C KEYPAD.ASM 150. 526. + P16F84A.INC 50* +TMR0_CNT C KEYPAD.ASM 67* 69. +TMR0_PRE C KEYPAD.ASM 68* 518. +TMR0_PRIME C KEYPAD.ASM 69* 149. 525. +TRISA C KEYPAD.ASM 50. + P16F84A.INC 62* +TRISB C KEYPAD.ASM 49. + P16F84A.INC 63* +TRISKEY C KEYPAD.ASM 49* 511. +TRISOUT C KEYPAD.ASM 50* 501. +W C P16F84A.INC 44* +WR C P16F84A.INC 105* +WREN C P16F84A.INC 104* +WRERR C P16F84A.INC 103* +Z C KEYPAD.ASM 156. 189. 200. 205. 330. 358. 392. 472. + P16F84A.INC 74* +_CP_OFF C P16F84A.INC 124* +_CP_ON C P16F84A.INC 123* +_HS_OSC C P16F84A.INC 131* +_LP_OSC C P16F84A.INC 129* +_PWRTE_OFF C P16F84A.INC 126* +_PWRTE_ON C P16F84A.INC 125* +_RC_OSC C P16F84A.INC 132* +_WDT_OFF C P16F84A.INC 128* +_WDT_ON C P16F84A.INC 127* +_XT_OSC C P16F84A.INC 130* +__16F84A V KEYPAD.ASM 17* + P16F84A.INC 34. +_fsr C KEYPAD.ASM 93* 135. 164. +_pclath C KEYPAD.ASM 94* 137. 162. +_status C KEYPAD.ASM 95* 133. 166. +_w C KEYPAD.ASM 96* 129. 168. 169. +bit2row A KEYPAD.ASM 293* 419. +check_key A KEYPAD.ASM 387* 399. + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 3 + + MPASM Cross Reference File + +LABEL TYPE FILE NAME SOURCE FILE REFERENCES +----- ---- --------- ---------------------- + +clock_bit A KEYPAD.ASM 350. 352* +col1_keys A KEYPAD.ASM 262* 436. +col1_xlate A KEYPAD.ASM 429. 434* +col2_keys A KEYPAD.ASM 268* 442. +col2_xlate A KEYPAD.ASM 430. 440* +col3_keys A KEYPAD.ASM 274* 448. +col3_xlate A KEYPAD.ASM 431. 446* +col4_keys A KEYPAD.ASM 280* 454. +col4_xlate A KEYPAD.ASM 432. 452* +col_select A KEYPAD.ASM 195. 247* +count C KEYPAD.ASM 104* 215. 219. 346. 357. 386. 398. 537. +current_col C KEYPAD.ASM 105* 186. 188. 191. 194. 426. 535. +debounce A KEYPAD.ASM 384* 395. +init A KEYPAD.ASM 184. 484* +key_get A KEYPAD.ASM 202. 381* +key_out A KEYPAD.ASM 209. 326* +key_scan A KEYPAD.ASM 190. 193* +key_val C KEYPAD.ASM 106* 335. 349. 360. 383. 391. 394. 397. 417. 420. 435. 437. 441. + 443. 447. 449. 453. 455. 536. +key_xlate A KEYPAD.ASM 208. 410* +main A KEYPAD.ASM 119. 183* +matched A KEYPAD.ASM 393. 396* +par_out C KEYPAD.ASM 100* 329. 490. 492. +restore_context A KEYPAD.ASM 144. 161* +scan A KEYPAD.ASM 185* 192. 201. 206. 222. +scan_delay A KEYPAD.ASM 216* 220. +serial_latch A KEYPAD.ASM 359. 364* +serial_out A KEYPAD.ASM 331. 344* +shift_bit A KEYPAD.ASM 347* 361. +tmr0_svc A KEYPAD.ASM 143. 147* +tmr128 C KEYPAD.ASM 34* +tmr16 C KEYPAD.ASM 31* +tmr2 C KEYPAD.ASM 28* +tmr256 C KEYPAD.ASM 35* +tmr32 C KEYPAD.ASM 32* 68. +tmr4 C KEYPAD.ASM 29* +tmr64 C KEYPAD.ASM 33* +tmr8 C KEYPAD.ASM 30* +wait A KEYPAD.ASM 218. 339. 355. 367. 389. 468* +wait_count C KEYPAD.ASM 107* 155. 157. 469. 471. 538. +waiting A KEYPAD.ASM 470* 473. + MPASM 03.00 Released KEYPAD.ASM 6-18-2002 17:39:48 PAGE 4 + + MPASM Cross Reference File + +LABEL TYPE FILE NAME SOURCE FILE REFERENCES +----- ---- --------- ---------------------- + + + +LABEL TYPES +----------- +A Address +C Constant +E External +M Macro +S Segment +U Unknown +V Variable +X Other diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..653bfcf --- /dev/null +++ b/readme.txt @@ -0,0 +1,230 @@ +keypad - Copyright (c) 2002 Tundraware Inc., All Rights Reserved +$Id: readme.txt,v 1.4 2002/05/31 17:16:20 tundra Exp tundra $ + + +************************************************************************ + +PLEASE NOTE: Before using anything in this archive, you must read, and + agree to abide by, the licensing terms found in: + + keypad-license.txt + +************************************************************************ + + +FILE DESCRIPTIONS +================= + + +Makefile Unix-style makefile which runs under DJGPP and + should also work under MKS and Cygwin. + +readme.txt This file. + +keypad-license.txt Licensing terms for using this software. + +keypad.gif keypad schematic in GIF format. + +keypad.png keypad schematic in png format. + +keypad.ps keypad schematic in PostScript format. + +keypad.sch keypad schematic in Eagle format. + +keypad.brd keypad printed circuit board layout in Eagle format. + +keypad.asm keypad software written in PIC assembler. + +keypad.hex The assembled keypad software. + +keypad.lst keypad listing file generated by assembler. + +keypad.xrf keypad cross-reference file generated by assmbler. + + + +WHAT IS 'keypad'? +================== + + +'keypad' is a PIC based system for decoding switch matrix type numeric +keypads with up to 4 rows and columns. The keypad switch matrix is +read, and if a key is pressed, it is converted into an equivalent +binary value (0-0fh) for output. Full debounce logic is included to +suppress mechanical switch bounce effects. + +Output can either be a 4-bit parallel word or a serial clocked output. +Both serial and parallel outputs support a "latching" pulse to drive +external interface timing. + + +ABOUT THE HARDWARE +================== + +'keypad' is built around a very simple PIC 16F84 circuit. This +circuit uses an RC oscillator because timing is not particularly +critical in this application. The keypad hardware is connected to +PORTB and output is found on PORTA. MCLR is pulled up so that noise +does not reset the system. RA4 is pulled-up to allow for selection +of serial or parallel output as described below. + +This release includes the schematic in a number of common formats. + +***VERY IMPORTANT NOTE***: The schematic shows *both* a crystal +network and an RC network connected to OSC1/OSC2. This is intentional +so that the resulting printed circuit board has provision for either a +crystal or RC oscillator. However, you only use one *or* the other, +never both. This approach allows one printed circuit board to be used +in a variety of applications. In the case of 'keypad', the software +assumes an RC network formed by R2 and C2. You do *not* use Q1, C3, +or C4 at all. They should not be handwired into a circuit, nor should +they be populated on the printed circuit board. + + +ABOUT THE SOFTWARE +================== + +NOTE: The 'keypad' code is pretty thoroughly commented and is a good + place to go to understand the details of just how this stuff + actually works. + + +The 'keypad' software has 4 major elements: + +TMR0 Interrupt Routine - This creates a "heartbeat" clock with an + approximate period of 480us. This is used when + doing debounce waits and for timing the + output latching and serial clocking pulses. + +Mainline Code - After some initialization, the main code continuously + loops through each keypad column looking to see if a + key has been pressed. If so, it reads a debounced + version of the key, translates it into and equivalent + binary value and outputs the result either serially or + as a parallel nibble. + +Translation Tables - This code makes extensive use of translation + tables to pickup the various column selection bit + patterns and to translate key hit bit patterns + found on the keypad interface into equivalent + binary values for output. + +Supporting Subroutines - These are the various subroutines called by + the Mainline Code to initially setup the + hardware, and thereafter scan and process key + hits. + + +The basic idea is that the column lines of the keypad are connected to +PORTB 4:7 and the row lines are connected to PORTB 0:3. The column +lines default to a logical high, and the row lines are pulled up to a +logical high using the PIC weak pullup capabilities. + +'keypad' successively scans each keypad column by setting that +column's control bit to low. Then, if a key is pressed in that +column, it shorts the corresponding row/column lines together. Since +the row line is pulled high with an internal weak pullup and the +column line is low, this has the effect of pulling the row line low. +By examining which column line is currently enabled (low) and which +row line has been pulled low, 'keypad' can tell which key got pressed +and then translate it into an equivalent binary value. + +It's not quite this simple, though, because mechanical switches +"bounce" when they are pressed or released. The software has to wait +until this bouncing is done before reading the keyboard interface or +you will get bogus key press values. the 'key_get' routine in this +software incorporates so-called "debounce" logic to avoid this +problem. A key hit is not considered valid until it has remained +unchanged DEBOUNCE_COUNT (5) times. The routine waits DEBOUNCE_TIME +(10 * TMR0 interval = 4.8ms) between read attempts. + +During software intialization, the 'init' subroutine reads the +hardware configuration to determine whether you want serial or +parallel output. (See the next section on how to configure the +hardware to do this.) Thereafter, it uses that output method. In +other words, if you change the Serial/Parallel output selection while +'keypad' is running, it will be ignored - you have to do a device +reset to reread this configuration. The 'key_out' routine supports +both serial and parallel output modes and checks a flag set during +initialization to decide which one to use. + + +HOW TO SELECT SERIAL/PARALLEL OUTPUT +==================================== + +'keypad' is capable of delivering the binary value of the key +press as either a 4-bit parallel word *or* as a serial bit stream. + +To select parallel output: + + Pull RA4 high *through a 10K resistor*. + +To select serial output: + + Pull RA4 to ground (low). + + +Parallel Bit Assignments: + + RA0 - Bit 0 out + RA1 - Bit 1 out + RA2 - Bit 2 out + RA3 - Bit 3 out + RA4 - Latch out - Normally low. Goes high for + approximately 480us (LATCH_TIME * TMR0 interval) + when the word on A0:3 is valid. + + +Serial Bit Assignments: + + RA0 - Serial Data + RA1 - Serial Clock - Normally low. Goes high for + approximately 480us (CLK_TIME * TMR0 interval) + when bit on A0 is valid + RA2 - Latch out - Normally low. Goes high for + approximately 480us (LATCH_TIME * TMR0 interval) + when all bits in current value have been clocked out. + RA3 - Unused + RA4 - Unused + + +USING 3- and 4-COLUMN KEYPADS +============================= + +The 'keypad' code assumes 4x4 keypad. However it is trivial to use a +3 column keypad (4x3). To use this smaller keypad, just don't connect +anything to bit B7. To avoid noise, you probably should pull this +pin high with a 10K resistor. + +You can also change the MAX_COL value to 3 in the code which will +inhibit scanning for the 4th column. I prefer *not* to do this so +that one PIC can handle both keypad types. + + +MAPPING OF KEYPAD VALUES +======================== + +The numeric keys on the keypad are mapped to their equivalent +binary values. The remaining keys are mapped as follows: + +R1C4 0ah +R2C4 0bh +R3C4 0ch +R4C4 0dh +R4C1 (*) 0eh +R4C3 (#) 0fh + +If you don't like these assignments you can change them by modifying +the 'colX_keys" translation tables, where 'X' is the column in +question. + + +BUGS +==== + +This is *experimental software* and has not been tested thorougly. +It probably has bugs. If you find one, please let me know and +I'll make the necessary changes. + +Happy Hacking! +tundra@tundraware.com