CODE SEGMENT Org 0100 Main: Jmp Install ;---------------------------------------------------------------------------; ; ; ; Data Areas, Constants, Etc. ; ; ; ;---------------------------------------------------------------------------; Version Db CR,'Switch Directory - DOS 1.0',CR,LF Copyright Db 'Copyright (c) 1987, 1988 by Stephen M. Falatko',CR,LF FakeEOF Db 26 Errlvl Db 0 ;DOS return code ; ; These are flags set by the command line processing ; ; RootFlag Db 0 ; signal indicating default to root (0) CDFlag Db 0 ; signal of specific path (1) OneDeepFlag Db 0 ; search only current dir (1) ; ; This flag is set to indicate that a subdirectory has been found (ie if its ; 0 at the end then we did not find the subdirectory) ; Done_Flag Db 0 ; found subdir during search ; ; If this flag is set then help is available if ? is entered on the ; command line ; HelpFlag Db 1 ; ; If this flag is set then we can use the internal stack feature ; StackFlag Db 1 StackAddress Dw ProgramEndH ; ; The Stack_Pointer points to the internal stack path. This is initialized ; to 0 and changes depending on user input. ; Stack_Pointer Db 0 InternalStackMsg Db CR,LF,'Internal Stack:',CR,LF,CR,LF,Stopper Numbers Db ' 0 - ',0 Db ' 1 - ',0 Db ' 2 - ',0 Db ' 3 - ',0 Db ' 4 - ',0 Db ' 5 - ',0 Db ' 6 - ',0 Db ' 7 - ',0 Db ' 8 - ',0 Db ' 9 - ',0 CR_LF Db CR,LF,Stopper ; ; These variables hold the systems Ctrl-Break address so we can restore ; it when we exit ; CtrlBrkOff Dw 0 CtrlBrkSeg Dw 0 ; ; Here we will store the desired subdirectory (and drive if selected) ; as well as the original path and drive ; Sub_Dir Db 63 Dup (0) ; The sub dir we want to change to ScratchDirStart Db 'x:\' ; This is a scratch area for the ScratchDir Db 63 Dup (0) ; GetDir function OD LABEL Word OrigDr Db 'x:' ; Original drive OrigDir Db '\',63 Dup (0) ; and path RootDir Db 'x:\',0 ; To get vol label Count Dw 0 ; Number of args on command line ; ; These variables are used by the search routine ; DtaPointer Dw DtaAreaBegin ; Pointer to our DTA area Direction Db 0 ; Flag to indicate search subdirs ; of the current dir or not BackOneDir Db '..',0 ; Asciiz 'filename' to backup ; one directory SearchAsciiZ Db '*.*',0 ; Search filename Old_INT_21 LABEL Dword ; Storage for previous INT 21 INT_21Off Dw ? INT_21Seg Dw ? FirstTime? Db 1 ; flag to signal first pass ; through INT 21 handler Command_Addr Dw ? ; segment address of command.com ; ; We want to save the callers DS:DX in the INT 21 handler ; Callers_DS Dw ? ; caller's data segment Callers_DX Dw ? ; caller's dx register CReturn Db 0D CR_LFString Db 0D,0A,'$' ; ; Command is the string that we look for at the DOS prompt. It must ; be 8 characters long with the empty spaces blanks. ; Command Db 'SD ' ; ; Error messages ; NoHelp Db CR,LF,'ERROR - Installed without help',CR,LF,Stopper NoStack Db CR,LF,'ERROR - Installed without Stack feature',CR,LF,Stopper ErrorMsgs Db CR,LF,'Illegal drive specifier - must be A to z',CR,LF,Stopper Db CR,LF,'Maximum of 64 characters on command line',CR,LF,Stopper Db CR,LF,'Illegal character on command line ',CR,LF,Stopper Db CR,LF,'Currently in root directory ',CR,LF,Stopper Db CR,LF,'Command line contains an invalid path ',CR,LF,Stopper Db CR,LF,'Subdirectory Not Found ',CR,LF,Stopper Db CR,LF,'Selected stack entry is empty ',CR,LF,Stopper New_INT_21: PUSH ES,DS,BP,SI,DI,AX,BX,CX,DX ; ; Is this a request for buffered input? If not go to next INT 21. ; CMP AH,0A ; Function 0A (hex) ? IF NE JMP Exit_INT_21 ; If not then let's leave .... ; ; Let's get the length of the original caller's buffer DS:DX points ; to caller's buffer with the first byte holding the maximum length. ; MOV BX,DX DS MOV CL,B [BX] ; ; Save DS and DX of calling program and make DS equal to CS ; PUSH DS ; Store caller's DS MOV DS,CS ; Change DS to CS POP Callers_DS ; Pop caller's DS to Old_DS PUSH DX ; Store caller's DX POP Callers_DX ; ; We will use our command line for a buffer so copy the max length of the ; callers buffer to the first position of the new buffer ; MOV BX,080 ; Point BX to the PSP command line MOV B [BX],CL ; Store the buffer length in the ; first position ; ; Point the BP to the SP ; MOV BP,SP ; ; Now, if it's the first time through here then COMMAND.COM is calling and we ; save the segment address off the stack. By doing this we can later ; verify if a caller is COMMAND.COM or not. ; TEST FirstTime? ; If not the first time go on JZ Not_First_Time SS MOV BX,W [BP+4] ; Get COMMAND.COM's segment address MOV Command_Addr,BX ; Save it MOV FirstTime?,0 ; Clear flag JMP Intercept ; ; If this is not the first time through then we want to see if the caller ; is COMMAND.COM or not. ; Not_First_Time: SS MOV BX,W [BP+4] ; Get caller's segment address CMP BX,Command_Addr ; Compare it with COMMAND.COM'S IF NE JMP Exit_INT_21 ; If its not the same go to next INT 21 ; ; Now we know that the caller is DOS so let's get the user input into our ; own temporary buffer so we can check it against our commands. ; ; We begin by setting up a DOS call for buffered input. ; Intercept: MOV DX,080 ; Point DS:DX to our PSP MOV AH,0A ; DOS function call 0A hex PUSHF ; Simulate DOS interrupt CALL Old_INT_21 ; ; We have performed the caller's INT 21 call, now we must see if the ; entered command is one of ours or whether we must pass it on to COMMAND.COM ; PUSHF ; First save the flags CLD ; and clear the direction flag ; ; To simplify our comparison we will use DOS function 29 hex, parse filename, ; to strip leading blanks and capitalize the input string. We will store the ; result in the PSP FCB #1 location ; MOV ES,CS ; Make ES equal CS MOV SI,082 ; The source string starts in the PSP MOV DI,05C ; Destination is in the PSP MOV AX,02901 ; Parse filename call, strip leading ; seperators (blanks etc.) PUSHF ; Simulate DOS interrupt CALL Old_INT_21 ; ; Now, we have a copy of the entered command capitalized and stripped of ; leading blanks at offset 5D in the PSP. The question is, is the command ; one of ours ? ; PUSH SI MOV SI,OFFSET Command ; SI points to our command MOV DI,05D ; DI points to what has been typed in MOV CX,8 ; Check 8 characters REPE CMPSB JCXZ Its_Ours ; If CX is zero all characters matched JMP Send_It_to_CC ; If not then we need to put command ; in COMMAND.COM's buffer. ; ; We have found our command in the buffer so we process the request. ; First we'll output a carriage return - line feed sequence to the ; monitor. ; Its_Ours: MOV DX,OFFSET CR_LFString MOV AH,09 ; print CRLF sequence PUSHF CALL Old_INT_21 ; ; Now we want to get back SI, which points to the first character after ; SD on the command line. Then we can call the main processor ; POP SI CALL Main_Process ; ; We're done so we point BP to a CR, clean the stack and go on. ; MOV BP,OFFSET CReturn ; Point BP to a carriage return ; character POPF JMP SITC ; ; Now its time to send deal with COMMAND.COM's buffer. If we found one of ; our commands then BP points to a CR. Otherwise BP will point to the user's ; command that is in our PSP at OFFSET 082 (hex). ; Send_It_to_CC: POP SI POPF ; Get flags off the stack MOV BP,082 ; Point BP to the entered data (in ; our PSP) SITC: ; Entry point if we found one of our ; commands PUSH Callers_DS ; Make ES equal to COMMAND.COM's DS POP ES ; that we saved MOV DI,Callers_DX ; Point DI to COMMAND.COM's DX ADD DI,2 ; Move past the length specifiers MOV SI,BP ; Point SI to BP MOV AL,0 ; Initialize counter for string length ; ; Now that all the bookkeeping is done we can move the string to DOS's ; buffer. ; Move: MOVSB ; Move byte CMP B [SI-1],0D ; Last character moved a CR ? JE Finished_Move ; If so we are done INC AL ; Otherwise increment counter JMP Short Move ; and continue ; ; Our last step is to store the length of the string in COMMAND.COM's ; buffer ; Finished_Move: MOV DI,Callers_DX ; Point DI to COMMAND.COM's DX INC DI ; Increment it MOV B [DI],AL ; Store actual string length ; ; Now we can leave .... ; POP DX,CX,BX,AX,DI,SI,BP,DS,ES IRET Exit_INT_21: POP DX,CX,BX,AX,DI,SI,BP,DS,ES CS JMP Old_INT_21 ;---------------------------------------------------------------------------; ; Main_Process ; ; ; ; Main_Process performs all the searching and switching that is the ; ; heart of SDDOS ; ; ; ;---------------------------------------------------------------------------; Main_Process: CALL SetUP ; Save current drive and path, reset drive ; ; We begin by determining if there are any command line arguments. ; We look in the PSP for the command line count. ; CALL StripBlanks ; Strip any leading blanks CMP B [SI],CR ; Next character a carriage return ? JE No_Parameters MOV CX,SI ; Get the number of characters on the SUB CX,082 ; command line (from the PSP) MOV AL,B [081] ; Any characters left on command line ? SUB AX,CX CMP AX,64 ; more than 64 characters not allowed JA Got_Parameters MOV Errlvl,2 JMP Error_Found ; ; If we find nothing then we show the current path and leave ; No_Parameters: CALL ShowPath ; set root dir and leave JMP Exit ; ; We have found some parameters so we processes them. ; Got_Parameters: CALL CommandLine ; ; If the carry flag is set when we exit CommandLine we were unsuccessful ; JC Error_Found ; ; If Done_Flag is set then we were successful, we're finished and we can leave ; TEST Done_Flag IF NZ JMP Exit ; ; If we return from CommandLine with CDFlag set that indicates that a ; specific path has been selected and we switch to that specified path. ; Otherwise we search for the desired subdirectory ; TEST CDFlag JZ Look_For_The_Subdir CALL SetPath ; ; If the carry flag is set upon return from SetPath the path does not ; exist and we display the not found message and return to the starting point ; otherwise we're through and we can leave ; IF NC JMP SHORT Exit MOV Errlvl,5 ; signal error type (invalid path) JMP SHORT Error_Found ; ; Now if CDFlag was not set we must search for the subdir. We will begin by ; searching the current directory (like the CD command) and then, if required, ; we'll search the rest of the disk. ; Look_For_The_Subdir: MOV OneDeepFlag,1 ; search current level CALL GetDir ; Read the directory ; ; Now, we reset OneDeepFlag just in case and see if we were successfull ; MOV OneDeepFlag,0 ; reset OneDeepFlag TEST Done_Flag ; did we find it? JNZ Exit ; found it so leave ; ; If we were not successful searching the current directory then we search ; more of the disk. (if rootflag is set then we search the whole disk, ; otherwise we search only the subordinate directories. ; TEST RootFlag ; default to the root directory? IF Z CALL No_Arg ; if not equal set to root for search CALL GetDir ; Read the directory ; ; If Done_Flag is set then we have been successful, otherwise we did not ; find the desired subdirectory. ; TEST Done_Flag JNZ Exit MOV Errlvl,6 ; signal error type (subdir not found) JMP SHORT Error_Found ; ; If we make it here we have not found the subdirectory so we tell the user ; and return them to the starting drive:subdirectory. ; Error_Found: ; ; We begin by sending a message to the user ; CALL Error_Message ; ; Now we reset the drive if it has been changed. ; SUB DX,DX ; clear DX MOV DL,OrigDr ; get original drive CMP DL,RootDir ; compare with current drive ; ; If the selected directory does not match the original directory reset ; JE Same_Drive SUB DL,'A' ; change DL from ascii Set_Drive ; Macro... ; ; Now we reset to our original path and leave ; Same_Drive: Change_Dir OrigDr ; Set path to original path (Macro...) Exit: MOV RootFlag,0 ; reset flags for next time MOV CDFlag,0 MOV OneDeepFlag,0 MOV Done_Flag,0 MOV Errlvl,0 MOV DtaPointer,offset DtaAreaBegin ; reset pointer to our DTA MOV DI,[DtaPointer] MOV AX,0 MOV CX,43 Dta_Clear: STOSW LOOP Dta_Clear ; ; During the Setup procedure we took over the Ctrl-Break address ; so now we restore it. ; MOV DX,CtrlBrkOff ; Ctrl-Break offset MOV DS,CtrlBrkSeg ; Ctrl-Break segment MOV AX,02523 ; set interrupt vector MOV DS,CS PUSHF CALL Old_INT_21 RET ; yes, exit with far return ;---------------------------------------------------------------------------; ; Error_Message ; ; ; ; Error_Message takes the error in errlvl and displays the appropriate ; ; message ; ; ; ;---------------------------------------------------------------------------; Error_Message: XOR AX,AX ; clear AX MOV DX,OFFSET ErrorMsgs ; point to the beginning of the error msgs MOV AL,Errlvl ; which error? DEC AX ; decrement for position MOV CX,45 ; characters per message MUL CL ; times error type-1 ADD DX,AX ; point to it CALL PrintS RET ;---------------------------------------------------------------------------; ; No_Arg ; ; ; ; No_Arg resets the current path to the root directory. ; ; ; ;---------------------------------------------------------------------------; No_Arg: ; If no argument then set current Change_Dir RootDir ; path to root directory RET ;---------------------------------------------------------------------------; ; SetUp ; ; ; ; SetUp initializes some variables and resets the disk drives ; ; ; ;---------------------------------------------------------------------------; SetUp: PUSH DX,SI,ES ; ; We begin with a disk reset ; MOV AH,0D ; Reset diskettes PUSHF CALL Old_INT_21 ; ; Now we call DOS for the current disk drive and store the information ; as an ascii drive specifier in several variables for future use ; Current_Disk ; Get current disk (Macro...) ADD AL,'A' MOV OrigDr,AL ; Save original drive letter MOV RootDir,AL ; MOV ScratchDirStart,AL ; ; We also want to store our current path so we can return if necessary MOV DL,OrigDr ; put original drive in DL SUB DL,'@' ; convert from ascii character MOV SI,OFFSET OrigDir + 1 ; the original drive Get_Path ; Macro... ; ; Our last task is to point the Ctrl+Break vector to our Not_Found code ; so the user is left where they began if using Ctrl+Break. But first we ; store the current Ctrl-Brk vector so we can restore it when we leave ; MOV AX,03523 ; call DOS for Ctrl-Break location PUSHF CALL Old_INT_21 MOV CtrlBrkSeg,ES MOV CtrlBrkOff,BX ; ; Now let's set up our Ctrl-Brk. ; MOV AX,02523 ; set Ctrl+Break vector to point MOV DX,OFFSET CtrlBrk ; to our not found. This way a Ctrl+Brk ; will leave us in the place we started PUSHF CALL Old_INT_21 POP ES,SI,DX RET ;---------------------------------------------------------------------------; ; CommandLine ; ; ; ; CommandLine parses the command line, looking for switches and sub- ; ; dir names ; ; ; ;---------------------------------------------------------------------------; CommandLine: ; ; We begin by setting DI ; MOV DI,OFFSET Sub_dir ; point DI to our internal buffer for ; the desired sub directory name ; ; We check for two switches, the internal stack switch and the enqueue switch. ; If we find either in the first position we don't check the command line ; for a drive specifier. ; CMP B [SI],'"' JE Parse_Command_Line CMP B [SI],'[' JE Parse_Command_Line CALL Do_Drive CMP Errlvl,1 IF E JMP ExitCL CALL StripBlanks CMP B [SI],CR JNE Parse_Command_Line MOV Done_Flag,1 JMP ExitCL ; ; We've now found a drive if it has been specified and we're ready ; to look at the rest of the command line ; Parse_Command_Line: LODSB ; get character from command line and ; put it in al CMP AL,CR ; is it a carriage return ? IF E JMP We_Are_Finished ; if so we're at the end so jump on ; ; If we find a '.' character we must check for '..' which CD uses ; to go back one level ; Back_One?: CMP AL,'.' JNE Display_Help? ; ; We found one '.' but are there two? ; CMP W [SI-1],'..' ; two periods? JE Go_Back_One ; if so back one dir. ; ; If there are not two periods, we may have an extension on the subdir ; name. We check to see if the period is the first character and if it is ; we assume an error, otherwise we process it and go on. ; CMP DI,OFFSET Sub_Dir ; is it the first character ? IF NE JMP Process_Character ; if not then process it STC ; otherwize - ERROR! MOV Errlvl,3 ; signal error type (illegal character) JMP ExitCL Go_Back_One: Change_Dir BackOneDir ; change back one JNC Go_Back_One_Worked MOV Errlvl,4 ; signal error type (in root) JMP ExitCL ; leave Go_Back_One_Worked: MOV Done_Flag,1 ; else set done_flag and leave JMP ExitCL ; do a not so nice jump to exit ; ; If the help character (?) is the first character on the command line ; then we display the help message and leave ; Display_Help?: CMP AL,'?' ; help character? JNE Go_Home? CMP DI,OFFSET Sub_Dir ; is it the first character ? JNE Do_Internal_Stack ; ; Now that we have found the help character is help available? ; TEST HelpFlag ; help info loaded ? JNZ Show_Help ; yes so display it ; ; Help not available, display message. ; MOV DX,OFFSET NoHelp ; display error message and leave CALL PrintS MOV Done_Flag,1 JMP ExitCL Show_Help: MOV DX,OFFSET Help ; yes, let's display the help screen and CALL PrintS ; then leave MOV Done_Flag,1 JMP ExitCL ; ; Set the path to the one indicated in Stack_Pointer ? ; Go_Home?: CMP AL,'@' ; jump 'home' ? JNE Do_Internal_Stack CMP B [SI],CR ; next character a carriage return ? IF NE JMP Kill? ; if not assume a valid @ in path name MOV AL,Stack_Pointer ; get pointer to current location PUSH AX ; save stack position CALL StackBufferPos ; get offset into stack buffer CMP B [SI],0 ; empty stack position ? IF NE JMP MoveToPath ; if so error POP AX ; clear stack JMP No_Internal_Path ; leave ; ; If we find a @" on the command line then we want to kill ourselves. ; Kill?: CMP B [SI],'"' IF NE JMP Process_Character ; if not assume a valid @ in path name ; ; Time to kill ourselves ..... ; PUSH DS MOV AX,02521 ; Revector INT 21 to MOV DX,INT_21Off ; the previous INT 21 MOV DS,INT_21Seg PUSHF CS CALL Old_INT_21 POP DS MOV AH,049 ; And free up our memory. (remember MOV ES,CS ; that the environment was already ; deallocated during installation) PUSHF CALL Old_INT_21 MOV Done_Flag,1 JMP ExitCL ; ; If we find the '"' switch we are to process the internal 'stack'. There ; are several possible options: 1) + go to next highest stack path (wraps) ; 2) - go to the next lowest stack path (wraps) 3) (Number) go to path ; number.. 4) (Number)= (several options) change internal stack ; ; We first check to see if we are enqueued to CED (or PCED). If we are ; not then we go on. ; Do_Internal_Stack: CMP AL,'"' ; Stack command switch? IF NE JMP Search_Below? CMP DI,OFFSET Sub_Dir ; is it the first character ? IF NE JMP ErrorIS TEST StackFlag ; stack memory available? JNZ Do_Stack ; yes ; ; Its not available, display error message. ; MOV DX,OFFSET NoStack ; display error message and leave CALL PrintS MOV Done_Flag,1 JMP ExitCL ; ; We have a valid '"' character so we begin by incrementing DI to point ; to the next command line character and checking to see if it is a '+' ; Do_Stack: CALL StripBlanks ; remove leading blanks CMP B [SI],'+' ; Jump to next highest dir ? JNE Jump_Back? MOV AL,Stack_Pointer ; get pointer to current location ; ; Now, let's jump to the next highest OCCUPIED (no 0 in first position) ; stack position ; J1: INC AL ; increment stack pointer CMP AL,0A ; over 9 ? IF E MOV AL,0 ; if so wrap to 0 CALL StackBufferPos ; get offset into stack buffer CMP B [SI],0 ; empty stack position ? JE J1 ; yes - try another PUSH AX ; save stack position JMP MoveToPath ; move to the new path ; ; Now, let's jump to the next lowest OCCUPIED (no 0 in first position) ; stack position ; Jump_Back?: CMP B [SI],'-' ; jump to next lowest dir ? JNE Jump_To_It? MOV AL,Stack_Pointer ; get pointer to current location J2: DEC AL ; decrement stack pointer CMP AL,0FFFF ; less than 0 ? IF E MOV AL,9 ; if so wrap to 9 CALL StackBufferPos ; get offset into stack buffer CMP B [SI],0 ; empty stack position ? JE J2 ; yes - try another PUSH AX ; save stack position JMP MoveToPath ; move to the new path ; ; Are we manipulating a specific stack entry ? If we find a 0 to 9 we are. ; Jump_To_It?: CMP B [SI],'0' ; Below 0 ? If so error IF B JMP ErrorIS CMP B [SI],'9' ; Above 9 ? If so might be show stack JA Show_Stack? CMP B [SI+1],'=' ; next char = ? If so modifing entry JE Stack_Entry JMP Set_Internal_Path ; otherwise move to that path ; ; Display the internal stack if s or S selected. ; Show_Stack?: CMP B [SI],'S' ; S or s entered ? If not error IF NE CMP B [SI],'s' IF NE JMP ErrorIS ; ; Display header and setup variables ; MOV DX,OFFSET InternalStackMsg ; display header CALL PrintS MOV DX,StackAddress ; store address of stack buffer PUSH DX MOV BX,OFFSET Numbers ; point to numbers (0 -, 1-, etc) MOV CX,0A ; loop 10 times ; ; This loop will print out the contents of each stack position ; S1: MOV DX,BX ; print the 0 -, 1 - CALL PrintS POP DX ; get back address to stack CALL PrintS ; print stack item ADD DX,64 ; point to next stack item PUSH DX ; save it MOV DX,OFFSET CR_LF ; print CR,LF sequence CALL PrintS ADD BX,6 ; point to next number (0 -...) LOOP S1 POP DX ; all done, clean up stack, set flag MOV Done_Flag,1 ; and leave JMP ExitCL Stack_Entry: SUB AX,AX ; clear AX MOV AL,B [SI] ; get number from command line SUB AL,030 ; convert from ascii PUSH SI ; get offset into stack buffer CALL StackBufferPos MOV DI,SI POP SI ADD SI,2 ; now point past '=' CMP B [SI+1],':' ; second character drive seperator ? JE StoreThePath ; If so we can go on MOV AX,OD ; store drive specifier incase some MOV W [DI], AX ; stack paths switch the drive ADD DI,2 CMP B [SI],'\' ; path on command line ? JE StoreThePath ; if so store it CMP B [SI],'@' ; get current path switch ? JE StoreCurrentPath CMP B [SI],' ' ; blank on command line ? IF NE JMP ErrorIS ; if so clear entry MOV B [DI-2],0 MOV Done_Flag,1 JMP ExitCL ; ; If the @ switch is on the command line we store the current path ; in the specified stack position. ; StoreCurrentPath: MOV B [DI],'\' ; start by insertAmbient light color: Red=0.039216 Green=0.039216 Blue=0.039216 Named object: "Object01" Tri-mesh, Vertices: 168 Faces: 336 Vertex list: Vertex 0: X: 101.499428 Y: -2.306819 Z: 0 Vertex 1: X: 98.385338 Y: -2.236042 Z: 11.624938 Vertex 2: X: 89.877487 Y: -2.04268 Z: 20.134983 Vertex 3: X: 78.255547 Y: -1.778542 Z: 23.249874 Vertex 4: X: 66.633614 Y: -1.514406 Z: 20.134981 Vertex 5: X: 58.125767 Y: -1.321046 Z: 11.624938 Vertex 6: X: 55.011677 Y: -1.250273 Z: 0.000004 Vertex 7: X: 58.125763 Y: -1.32105 Z: -11.624932 Vertex 8: X: 66.633606 Y: -1.514412 Z: -20.134977 Vertex 9: X: 78.255539 Y: -1.778549 Z: -23.249874 Vertex 10: X: 89.877472 Y: -2.042685 Z: -20.134989 Vertex 11: X: 98.38533 Y: -2.236045 Z: -11.62495 Vertex 12: X: 92.4487 Y: 41.96059 Z: -0.000006 Vertex 13: X: 89.612297 Y: 40.673206 Z: 11.624931 Vertex 14: X: 81.863098 Y: 37.156002 Z: 20.134977 Vertex 15: X: 71.277489 Y: 32.351406 Z: 23.24987 Vertex 16: X: 60.691883 Y: 27.546818 Z: 20.134977 Vertex 17: X: 52.94268 Y: 24.02961 Z: 11.624935 Vertex 18: X: 50.106274 Y: 22.742222 Z: 0 Vertex 19: X: 52.942677 Y: 24.029604 Z: -11.624936 Vertex 20: X: 60.691875 Y: 27.546808 Z: -20.134981 Vertex 21: X: 71.277481 Y: 32.351398 Z: -23.24988 Vertex 22: X: 81.863083 Y: 37.155991 Z: -20.134995 Vertex 23: X: 89.612289 Y: 40.673199 Z: -11.624957 Vertex 24: X: 65.087372 Y: 77.917183 Z: -0.000012 Vertex 25: X: 63.090431 Y: 75.526619 Z: 11.624927 Vertex 26: X: 57.634701 Y: 68.995476 Z: 20.134974 Vertex 27: X: 50.182037 Y: 60.073761 Z: 23.249866 Vertex 28: X: 42.72937 Y: 51.15205 Z: 20.134975 Vertex 29: X: 37.27364 Y: 44.620907 Z: 11.624931 Vertex 30: X: 35.276703 Y: 42.230335 Z: -0.000003 Vertex 31: X: 37.27364 Y: 44.620899 Z: -11.62494 Vertex 32: X: 42.729366 Y: 51.152039 Z: -20.134985 Vertex 33: X: 50.18203 Y: 60.073746 Z: -23.249884 Vertex 34: X: 57.634693 Y: 68.995461 Z: -20.134998 Vertex 35: X: 63.090427 Y: 75.526611 Z: -11.624962 Vertex 36: X: 24.834675 Y: 98.441322 Z: -0.000015 Vertex 37: X: 24.072725 Y: 95.421059 Z: 11.624924 Vertex 38: X: 21.991043 Y: 87.16954 Z: 20.134968 Vertex 39: X: 19.147409 Y: 75.897766 Z: 23.249863 Vertex 40: X: 16.303778 Y: 64.625992 Z: 20.134974 Vertex 41: X: 14.222095 Y: 56.374477 Z: 11.624929 Vertex 42: X: 13.460146 Y: 53.35421 Z: -0.000004 Vertex 43: X: 14.222095 Y: 56.37447 Z: -11.624941 Vertex 44: X: 16.303776 Y: 64.625977 Z: -20.134987 Vertex 45: X: 19.147408 Y: 75.897743 Z: -23.249887 Vertex 46: X: 21.991039 Y: 87.169518 Z: -20.135004 Vertex 47: X: 24.072723 Y: 95.421043 Z: -11.624965 Vertex 48: X: -20.336836 Y: 99.467918 Z: -0.000015 Vertex 49: X: -19.712885 Y: 96.416161 Z: 11.624924 Vertex 50: X: -18.008217 Y: 88.078598 Z: 20.134968 Vertex 51: X: -15.679599 Y: 76.68927 Z: 23.249863 Vertex 52: X: -13.350981 Y: 65.299942 Z: 20.134974 Vertex 53: X: -11.646314 Y: 56.962383 Z: 11.624929 Vertex 54: X: -11.022363 Y: 53.910618 Z: -0.000004 Vertex 55: X: -11.646314 Y: 56.962376 Z: -11.624941 Page 1 Vertex 56: X: -13.35098 Y: 65.299934 Z: -20.134987 Vertex 57: X: -15.679597 Y: 76.689247 Z: -23.249887 Vertex 58: X: -18.008215 Y: 88.078568 Z: -20.135004 Vertex 59: X: -19.712883 Y: 96.416145 Z: -11.624965 Vertex 60: X: -61.480385 Y: 80.793663 Z: -0.000012 Vertex 61: X: -59.594112 Y: 78.31485 Z: 11.624926 Vertex 62: X: -54.440727 Y: 71.542587 Z: 20.13497 Vertex 63: X: -47.40107 Y: 62.291512 Z: 23.249866 Vertex 64: X: -40.361412 Y: 53.040436 Z: 20.134975 Vertex 65: X: -35.208027 Y: 46.268181 Z: 11.624931 Vertex 66: X: -33.321754 Y: 43.789356 Z: -0.000003 Vertex 67: X: -35.208023 Y: 46.268173 Z: -11.62494 Vertex 68: X: -40.361408 Y: 53.040424 Z: -20.134985 Vertex 69: X: -47.401062 Y: 62.291496 Z: -23.249884 Vertex 70: X: -54.44072 Y: 71.542572 Z: -20.135 Vertex 71: X: -59.594109 Y: 78.314835 Z: -11.624962 Vertex 72: X: -90.446976 Y: 46.117218 Z: -0.000007 Vertex 73: X: -87.671989 Y: 44.702305 Z: 11.62493 Vertex 74: X: -80.090576 Y: 40.836685 Z: 20.134975 Vertex 75: X: -69.734169 Y: 35.556149 Z: 23.24987 Vertex 76: X: -59.377766 Y: 30.27561 Z: 20.134977 Vertex 77: X: -51.796352 Y: 26.40999 Z: 11.624935 Vertex 78: X: -49.021362 Y: 24.995071 Z: -0 Vertex 79: X: -51.796349 Y: 26.409985 Z: -11.624936 Vertex 80: X: -59.377758 Y: 30.275604 Z: -20.134983 Vertex 81: X: -69.734161 Y: 35.556137 Z: -23.24988 Vertex 82: X: -80.090561 Y: 40.836674 Z: -20.134995 Vertex 83: X: -87.671982 Y: 44.702297 Z: -11.624958 Vertex 84: X: -101.499428 Y: 2.306689 Z: -0 Vertex 85: X: -98.385338 Y: 2.23592 Z: 11.624937 Vertex 86: X: -89.877487 Y: 2.042571 Z: 20.134981 Vertex 87: X: -78.255547 Y: 1.778449 Z: 23.249874 Vertex 88: X: -66.633614 Y: 1.514327 Z: 20.134981 Vertex 89: X: -58.125767 Y: 1.320975 Z: 11.624938 Vertex 90: X: -55.011677 Y: 1.250203 Z: 0.000003 Vertex 91: X: -58.125763 Y: 1.320972 Z: -11.624932 Vertex 92: X: -66.633606 Y: 1.514321 Z: -20.134977 Vertex 93: X: -78.255539 Y: 1.778442 Z: -23.249874 Vertex 94: X: -89.877472 Y: 2.042564 Z: -20.134991 Vertex 95: X: -98.38533 Y: 2.235916 Z: -11.624951 Vertex 96: X: -92.448647 Y: -41.960709 Z: 0.000006 Vertex 97: X: -89.612244 Y: -40.673317 Z: 11.624944 Vertex 98: X: -81.863045 Y: -37.156101 Z: 20.134987 Vertex 99: X: -71.277443 Y: -32.351494 Z: 23.24988 Vertex 100: X: -60.691845 Y: -27.546888 Z: 20.134985 Vertex 101: X: -52.94265 Y: -24.029675 Z: 11.624942 Vertex 102: X: -50.106247 Y: -22.742285 Z: 0.000007 Vertex 103: X: -52.942646 Y: -24.029676 Z: -11.624929 Vertex 104: X: -60.691841 Y: -27.546892 Z: -20.134974 Vertex 105: X: -71.277435 Y: -32.351494 Z: -23.24987 Vertex 106: X: -81.863037 Y: -37.156101 Z: -20.134985 Vertex 107: X: -89.612236 Y: -40.673317 Z: -11.624945 Vertex 108: X: -65.087273 Y: -77.917267 Z: 0.000012 Vertex 109: X: -63.09034 Y: -75.526695 Z: 11.624949 Vertex 110: X: -57.634617 Y: -68.995544 Z: 20.134991 Vertex 111: X: -50.181961 Y: -60.073822 Z: 23.249884 Vertex 112: X: -42.729305 Y: -51.1521 Z: 20.134989 Vertex 113: X: -37.273586 Y: -44.620949 Z: 11.624946 Vertex 114: X: -35.276653 Y: -42.230381 Z: 0.00001 Vertex 115: X: -37.273582 Y: -44.620953 Z: -11.624926 Vertex 116: X: -42.729301 Y: -51.1521 Z: -20.134972 Page 2 Vertex 117: X: -50.181953 Y: -60.073822 Z: -23.249866 Vertex 118: X: -57.634609 Y: -68.995544 Z: -20.134981 Vertex 119: X: -63.090332 Y: -75.526695 Z: -11.62494 Vertex 120: X: -24.834549 Y: -98.441345 Z: 0.000015 Vertex 121: X: -24.072605 Y: -95.421074 Z: 11.624951 Vertex 122: X: -21.990931 Y: -87.169556 Z: 20.134996 Vertex 123: X: -19.147314 Y: -75.897774 Z: 23.249887 Vertex 124: X: -16.303696 Y: -64.625999 Z: 20.134991 Vertex 125: X: -14.222023 Y: -56.374493 Z: 11.624947 Vertex 126: X: -13.460078 Y: -53.354225 Z: 0.000011 Vertex 127: X: -14.222022 Y: -56.374493 Z: -11.624924 Vertex 128: X: -16.303694 Y: -64.625999 Z: -20.13497 Vertex 129: X: -19.14731 Y: -75.897781 Z: -23.249863 Vertex 130: X: -21.990929 Y: -87.169556 Z: -20.134975 Vertex 131: X: -24.072603 Y: -95.421074 Z: -11.624937 Vertex 132: X: 20.336964 Y: -99.467896 Z: 0.000015 Vertex 133: X: 19.713007 Y: -96.41613 Z: 11.624951 Vertex 134: X: 18.008329 Y: -88.07856 Z: 20.134996 Vertex 135: X: 15.679697 Y: -76.68924 Z: 23.249887 Vertex 136: X: 13.351064 Y: -65.299919 Z: 20.134991 Vertex 137: X: 11.646387 Y: -56.962364 Z: 11.624947 Vertex 138: X: 11.022431 Y: -53.910606 Z: 0.000011 Vertex 139: X: 11.646386 Y: -56.962364 Z: -11.624924 Vertex 140: X: 13.351063 Y: -65.299927 Z: -20.13497 Vertex 141: X: 15.679695 Y: -76.68924 Z: -23.249863 Vertex 142: X: 18.008327 Y: -88.07856 Z: -20.134975 Vertex 143: X: 19.713007 Y: -96.41613 Z: -11.624937 Vertex 144: X: 61.480488 Y: -80.793579 Z: 0.000012 Vertex 145: X: 59.594212 Y: -78.314766 Z: 11.624949 Vertex 146: X: 54.440815 Y: -71.542511 Z: 20.134993 Vertex 147: X: 47.401146 Y: -62.291443 Z: 23.249884 Vertex 148: X: 40.361477 Y: -53.040379 Z: 20.134989 Vertex 149: X: 35.208084 Y: -46.268131 Z: 11.624946 Vertex 150: X: 33.321812 Y: -43.789314 Z: 0.00001 Vertex 151: X: 35.208084 Y: -46.268131 Z: -11.624926 Vertex 152: X: 40.361473 Y: -53.040379 Z: -20.134972 Vertex 153: X: 47.401142 Y: -62.291443 Z: -23.249866 Vertex 154: X: 54.440811 Y: -71.542511 Z: -20.134977 Vertex 155: X: 59.594208 Y: -78.314766 Z: -11.624939 Vertex 156: X: 90.447037 Y: -46.117104 Z: 0.000007 Vertex 157: X: 87.67205 Y: -44.70219 Z: 11.624945 Vertex 158: X: 80.09063 Y: -40.836578 Z: 20.134987 Vertex 159: X: 69.734215 Y: -35.556053 Z: 23.24988 Vertex 160: X: 59.377804 Y: -30.27553 Z: 20.134987 Vertex 161: X: 51.796387 Y: -26.40992 Z: 11.624942 Vertex 162: X: 49.021393 Y: -24.99501 Z: 0.000007 Vertex 163: X: 51.796383 Y: -26.409922 Z: -11.624929 Vertex 164: X: 59.3778 Y: -30.275532 Z: -20.134974 Vertex 165: X: 69.734207 Y: -35.556053 Z: -23.24987 Vertex 166: X: 80.090614 Y: -40.836578 Z: -20.134983 Vertex 167: X: 87.672043 Y: -44.70219 Z: -11.624944 Face list: Face 0: A:0 B:13 C:1 AB:0 BC:1 CA:1 Smoothing: 1 Face 1: A:0 B:12 C:13 AB:1 BC:1 CA:0 Smoothing: 1 Face 2: A:1 B:14 C:2 AB:0 BC:1 CA:1 Smoothing: 2 Face 3: A:1 B:13 C:14 AB:1 BC:1 CA:0 Smoothing: 2 Face 4: A:2 B:15 C:3 AB:0 BC:1 CA:1 Page 3 Smoothing: 3 Face 5: A:2 B:14 C:15 AB:1 BC:1 CA:0 Smoothing: 3 Face 6: A:3 B:16 C:4 AB:0 BC:1 CA:1 Smoothing: 4 Face 7: A:3 B:15 C:16 AB:1 BC:1 CA:0 Smoothing: 4 Face 8: A:4 B:17 C:5 AB:0 BC:1 CA:1 Smoothing: 5 Face 9: A:4 B:16 C:17 AB:1 BC:1 CA:0 Smoothing: 5 Face 10: A:5 B:18 C:6 AB:0 BC:1 CA:1 Smoothing: 6 Face 11: A:5 B:17 C:18 AB:1 BC:1 CA:0 Smoothing: 6 Face 12: A:6 B:19 C:7 AB:0 BC:1 CA:1 Smoothing: 7 Face 13: A:6 B:18 C:19 AB:1 BC:1 CA:0 Smoothing: 7 Face 14: A:7 B:20 C:8 AB:0 BC:1 CA:1 Smoothing: 8 Face 15: A:7 B:19 C:20 AB:1 BC:1 CA:0 Smoothing: 8 Face 16: A:8 B:21 C:9 AB:0 BC:1 CA:1 Smoothing: 9 Face 17: A:8 B:20 C:21 AB:1 BC:1 CA:0 Smoothing: 9 Face 18: A:9 B:22 C:10 AB:0 BC:1 CA:1 Smoothing: 10 Face 19: A:9 B:21 C:22 AB:1 BC:1 CA:0 Smoothing: 10 Face 20: A:10 B:23 C:11 AB:0 BC:1 CA:1 Smoothing: 11 Face 21: A:10 B:22 C:23 AB:1 BC:1 CA:0 Smoothing: 11 Face 22: A:11 B:12 C:0 AB:0 BC:1 CA:1 Smoothing: 12 Face 23: A:11 B:23 C:12 AB:1 BC:1 CA:0 Smoothing: 12 Face 24: A:12 B:25 C:13 AB:0 BC:1 CA:1 Smoothing: 13 Face 25: A:12 B:24 C:25 AB:1 BC:1 CA:0 Smoothing: 13 Face 26: A:13 B:26 C:14 AB:0 BC:1 CA:1 Smoothing: 14 Face 27: A:13 B:25 C:26 AB:1 BC:1 CA:0 Smoothing: 14 Face 28: A:14 B:27 C:15 AB:0 BC:1 CA:1 Smoothing: 15 Face 29: A:14 B:26 C:27 AB:1 BC:1 CA:0 Smoothing: 15 Face 30: A:15 B:28 C:16 AB:0 BC:1 CA:1 Smoothing: 16 Face 31: A:15 B:27 C:28 AB:1 BC:1 CA:0 Smoothing: 16 Face 32: A:16 B:29 C:17 AB:0 BC:1 CA:1 Smoothing: 17 Face 33: A:16 B:28 C:29 AB:1 BC:1 CA:0 Smoothing: 17 Face 34: A:17 B:30 C:18 AB:0 BC:1 CA:1 Smoothing: 18 Page 4 Face 35: A:17 B:29 C:30 AB:1 BC:1 CA:0 Smoothing: 18 Face 36: A:18 B:31 C:19 AB:0 BC:1 CA:1 Smoothing: 19 Face 37: A:18 B:30 C:31 AB:1 BC:1 CA:0 Smoothing: 19 Face 38: A:19 B:32 C:20 AB:0 BC:1 CA:1 Smoothing: 20 Face 39: A:19 B:31 C:32 AB:1 BC:1 CA:0 Smoothing: 20 Face 40: A:20 B:33 C:21 AB:0 BC:1 CA:1 Smoothing: 21 Face 41: A:20 B:32 C:33 AB:1 BC:1 CA:0 Smoothing: 21 Face 42: A:21 B:34 C:22 AB:0 BC:1 CA:1 Smoothing: 22 Face 43: A:21 B:33 C:34 AB:1 BC:1 CA:0 Smoothing: 22 Face 44: A:22 B:35 C:23 AB:0 BC:1 CA:1 Smoothing: 23 Face 45: A:22 B:34 C:35 AB:1 BC:1 CA:0 Smoothing: 23 Face 46: A:23 B:24 C:12 AB:0 BC:1 CA:1 Smoothing: 24 Face 47: A:23 B:35 C:24 AB:1 BC:1 CA:0 Smoothing: 24 Face 48: A:24 B:37 C:25 AB:0 BC:1 CA:1 Smoothing: 25 Face 49: A:24 B:36 C:37 AB:1 BC:1 CA:0 Smoothing: 25 Face 50: A:25 B:38 C:26 AB:0 BC:1 CA:1 Smoothing: 26 Face 51: A:25 B:37 C:38 AB:1 BC:1 CA:0 Smoothing: 26 Face 52: A:26 B:39 C:27 AB:0 BC:1 CA:1 Smoothing: 27 Face 53: A:26 B:38 C:39 AB:1 BC:1 CA:0 Smoothing: 27 Face 54: A:27 B:40 C:28 AB:0 BC:1 CA:1 Smoothing: 28 Face 55: A:27 B:39 C:40 AB:1 BC:1 CA:0 Smoothing: 28 Face 56: A:28 B:41 C:29 AB:0 BC:1 CA:1 Smoothing: 29 Face 57: A:28 B:40 C:41 AB:1 BC:1 CA:0 Smoothing: 29 Face 58: A:29 B:42 C:30 AB:0 BC:1 CA:1 Smoothing: 30 Face 59: A:29 B:41 C:42 AB:1 BC:1 CA:0 Smoothing: 30 Face 60: A:30 B:43 C:31 AB:0 BC:1 CA:1 Smoothing: 31 Face 61: A:30 B:42 C:43 AB:1 BC:1 CA:0 Smoothing: 31 Face 62: A:31 B:44 C:32 AB:0 BC:1 CA:1 Smoothing: 32 Face 63: A:31 B:43 C:44 AB:1 BC:1 CA:0 Smoothing: 32 Face 64: A:32 B:45 C:33 AB:0 BC:1 CA:1 Smoothing: 1 Face 65: A:32 B:44 C:45 AB:1 BC:1 CA:0 Page 5 Smoothing: 1 Face 66: A:33 B:46 C:34 AB:0 BC:1 CA:1 Smoothing: 2 Face 67: A:33 B:45 C:46 AB:1 BC:1 CA:0 Smoothing: 2 Face 68: A:34 B:47 C:35 AB:0 BC:1 CA:1 Smoothing: 3 Face 69: A:34 B:46 C:47 AB:1 BC:1 CA:0 Smoothing: 3 Face 70: A:35 B:36 C:24 AB:0 BC:1 CA:1 Smoothing: 4 Face 71: A:35 B:47 C:36 AB:1 BC:1 CA:0 Smoothing: 4 Face 72: A:36 B:49 C:37 AB:0 BC:1 CA:1 Smoothing: 5 Face 73: A:36 B:48 C:49 AB:1 BC:1 CA:0 Smoothing: 5 Face 74: A:37 B:50 C:38 AB:0 BC:1 CA:1 Smoothing: 6 Face 75: A:37 B:49 C:50 AB:1 BC:1 CA:0 Smoothing: 6 Face 76: A:38 B:51 C:39 AB:0 BC:1 CA:1 Smoothing: 7 Face 77: A:38 B:50 C:51 AB:1 BC:1 CA:0 Smoothing: 7 Face 78: A:39 B:52 C:40 AB:0 BC:1 CA:1 Smoothing: 8 Face 79: A:39 B:51 C:52 AB:1 BC:1 CA:0 Smoothing: 8 Face 80: A:40 B:53 C:41 AB:0 BC:1 CA:1 Smoothing: 9 Face 81: A:40 B:52 C:53 AB:1 BC:1 CA:0 Smoothing: 9 Face 82: A:41 B:54 C:42 AB:0 BC:1 CA:1 Smoothing: 10 Face 83: A:41 B:53 C:54 AB:1 BC:1 CA:0 Smoothing: 10 Face 84: A:42 B:55 C:43 AB:0 BC:1 CA:1 Smoothing: 11 Face 85: A:42 B:54 C:55 AB:1 BC:1 CA:0 Smoothing: 11 Face 86: A:43 B:56 C:44 AB:0 BC:1 CA:1 Smoothing: 12 Face 87: A:43 B:55 C:56 AB:1 BC:1 CA:0 Smoothing: 12 Face 88: A:44 B:57 C:45 AB:0 BC:1 CA:1 Smoothing: 13 Face 89: A:44 B:56 C:57 AB:1 BC:1 CA:0 Smoothing: 13 Face 90: A:45 B:58 C:46 AB:0 BC:1 CA:1 Smoothing: 14 Face 91: A:45 B:57 C:58 AB:1 BC:1 CA:0 Smoothing: 14 Face 92: A:46 B:59 C:47 AB:0 BC:1 CA:1 Smoothing: 15 Face 93: A:46 B:58 C:59 AB:1 BC:1 CA:0 Smoothing: 15 Face 94: A:47 B:48 C:36 AB:0 BC:1 CA:1 Smoothing: 16 Face 95: A:47 B:59 C:48 AB:1 BC:1 CA:0 Smoothing: 16 Page 6 Face 96: A:48 B:61 C:49 AB:0 BC:1 CA:1 Smoothing: 17 Face 97: A:48 B:60 C:61 AB:1 BC:1 CA:0 Smoothing: 17 Face 98: A:49 B:62 C:50 AB:0 BC:1 CA:1 Smoothing: 18 Face 99: A:49 B:61 C:62 AB:1 BC:1 CA:0 Smoothing: 18 Face 100: A:50 B:63 C:51 AB:0 BC:1 CA:1 Smoothing: 19 Face 101: A:50 B:62 C:63 AB:1 BC:1 CA:0 Smoothing: 19 Face 102: A:51 B:64 C:52 AB:0 BC:1 CA:1 Smoothing: 20 Face 103: A:51 B:63 C:64 AB:1 BC:1 CA:0 Smoothing: 20 Face 104: A:52 B:65 C:53 AB:0 BC:1 CA:1 Smoothing: 21 Face 105: A:52 B:64 C:65 AB:1 BC:1 CA:0 Smoothing: 21 Face 106: A:53 B:66 C:54 AB:0 BC:1 CA:1 Smoothing: 22 Face 107: A:53 B:65 C:66 AB:1 BC:1 CA:0 Smoothing: 22 Face 108: A:54 B:67 C:55 AB:0 BC:1 CA:1 Smoothing: 23 Face 109: A:54 B:66 C:67 AB:1 BC:1 CA:0 Smoothing: 23 Face 110: A:55 B:68 C:56 AB:0 BC:1 CA:1 Smoothing: 24 Face 111: A:55 B:67 C:68 AB:1 BC:1 CA:0 Smoothing: 24 Face 112: A:56 B:69 C:57 AB:0 BC:1 CA:1 Smoothing: 25 Face 113: A:56 B:68 C:69 AB:1 BC:1 CA:0 Smoothing: 25 Face 114: A:57 B:70 C:58 AB:0 BC:1 CA:1 Smoothing: 26 Face 115: A:57 B:69 C:70 AB:1 BC:1 CA:0 Smoothing: 26 Face 116: A:58 B:71 C:59 AB:0 BC:1 CA:1 Smoothing: 27 Face 117: A:58 B:70 C:71 AB:1 BC:1 CA:0 Smoothing: 27 Face 118: A:59 B:60 C:48 AB:0 BC:1 CA:1 Smoothing: 28 Face 119: A:59 B:71 C:60 AB:1 BC:1 CA:0 Smoothing: 28 Face 120: A:60 B:73 C:61 AB:0 BC:1 CA:1 Smoothing: 29 Face 121: A:60 B:72 C:73 AB:1 BC:1 CA:0 Smoothing: 29 Face 122: A:61 B:74 C:62 AB:0 BC:1 CA:1 Smoothing: 30 Face 123: A:61 B:73 C:74 AB:1 BC:1 CA:0 Smoothing: 30 Face 124: A:62 B:75 C:63 AB:0 BC:1 CA:1 Smoothing: 31 Face 125: A:62 B:74 C:75 AB:1 BC:1 CA:0 Smoothing: 31 Face 126: A:63 B:76 C:64 AB:0 BC:1 CA:1 Page 7 Smoothing: 32 Face 127: A:63 B:75 C:76 AB:1 BC:1 CA:0 Smoothing: 32 Face 128: A:64 B:77 C:65 AB:0 BC:1 CA:1 Smoothing: 1 Face 129: A:64 B:76 C:77 AB:1 BC:1 CA:0 Smoothing: 1 Face 130: A:65 B:78 C:66 AB:0 BC:1 CA:1 Smoothing: 2 Face 131: A:65 B:77 C:78 AB:1 BC:1 CA:0 Smoothing: 2 Face 132: A:66 B:79 C:67 AB:0 BC:1 CA:1 Smoothing: 3 Face 133: A:66 B:78 C:79 AB:1 BC:1 CA:0 Smoothing: 3 Face 134: A:67 B:80 C:68 AB:0 BC:1 CA:1 Smoothing: 4 Face 135: A:67 B:79 C:80 AB:1 BC:1 CA:0 Smoothing: 4 Face 136: A:68 B:81 C:69 AB:0 BC:1 CA:1 Smoothing: 5 Face 137: A:68 B:80 C:81 AB:1 BC:1 CA:0 Smoothing: 5 Face 138: A:69 B:82 C:70 AB:0 BC:1 CA:1 Smoothing: 6 Face 139: A:69 B:81 C:82 AB:1 BC:1 CA:0 Smoothing: 6 Face 140: A:70 B:83 C:71 AB:0 BC:1 CA:1 Smoothing: 7 Face 141: A:70 B:82 C:83 AB:1 BC:1 CA:0 Smoothing: 7 Face 142: A:71 B:72 C:60 AB:0 BC:1 CA:1 Smoothing: 8 Face 143: A:71 B:83 C:72 AB:1 BC:1 CA:0 Smoothing: 8 Face 144: A:72 B:85 C:73 AB:0 BC:1 CA:1 Smoothing: 9 Face 145: A:72 B:84 C:85 AB:1 BC:1 CA:0 Smoothing: 9 Face 146: A:73 B:86 C:74 AB:0 BC:1 CA:1 Smoothing: 10 Face 147: A:73 B:85 C:86 AB:1 BC:1 CA:0 Smoothing: 10 Face 148: A:74 B:87 C:75 AB:0 BC:1 CA:1 Smoothing: 11 Face 149: A:74 B:86 C:87 AB:1 BC:1 CA:0 Smoothing: 11 Face 150: A:75 B:88 C:76 AB:0 BC:1 CA:1 Smoothing: 12 Face 151: A:75 B:87 C:88 AB:1 BC:1 CA:0 Smoothing: 12 Face 152: A:76 B:89 C:77 AB:0 BC:1 CA:1 Smoothing: 13 Face 153: A:76 B:88 C:89 AB:1 BC:1 CA:0 Smoothing: 13 Face 154: A:77 B:90 C:78 AB:0 BC:1 CA:1 Smoothing: 14 Face 155: A:77 B:89 C:90 AB:1 BC:1 CA:0 Smoothing: 14 Face 156: A:78 B:91 C:79 AB:0 BC:1 CA:1 Smoothing: 15 Page 8 Face 157: A:78 B:90 C:91 AB:1 BC:1 CA:0 Smoothing: 15 Face 158: A:79 B:92 C:80 AB:0 BC:1 CA:1 Smoothing: 16 Face 159: A:79 B:91 C:92 AB:1 BC:1 CA:0 Smoothing: 16 Face 160: A:80 B:93 C:81 AB:0 BC:1 CA:1 Smoothing: 17 Face 161: A:80 B:92 C:93 AB:1 BC:1 CA:0 Smoothing: 17 Face 162: A:81 B:94 C:82 AB:0 BC:1 CA:1 Smoothing: 18 Face 163: A:81 B:93 C:94 AB:1 BC:1 CA:0 Smoothing: 18 Face 164: A:82 B:95 C:83 AB:0 BC:1 CA:1 Smoothing: 19 Face 165: A:82 B:94 C:95 AB:1 BC:1 CA:0 Smoothing: 19 Face 166: A:83 B:84 C:72 AB:0 BC:1 CA:1 Smoothing: 20 Face 167: A:83 B:95 C:84 AB:1 BC:1 CA:0 Smoothing: 20 Face 168: A:84 B:97 C:85 AB:0 BC:1 CA:1 Smoothing: 21 Face 169: A:84 B:96 C:97 AB:1 BC:1 CA:0 Smoothing: 21 Face 170: A:85 B:98 C:86 AB:0 BC:1 CA:1 Smoothing: 22 Face 171: A:85 B:97 C:98 AB:1 BC:1 CA:0 Smoothing: 22 Face 172: A:86 B:99 C:87 AB:0 BC:1 CA:1 Smoothing: 23 Face 173: A:86 B:98 C:99 AB:1 BC:1 CA:0 Smoothing: 23 Face 174: A:87 B:100 C:88 AB:0 BC:1 CA:1 Smoothing: 24 Face 175: A:87 B:99 C:100 AB:1 BC:1 CA:0 Smoothing: 24 Face 176: A:88 B:101 C:89 AB:0 BC:1 CA:1 Smoothing: 25 Face 177: A:88 B:100 C:101 AB:1 BC:1 CA:0 Smoothing: 25 Face 178: A:89 B:102 C:90 AB:0 BC:1 CA:1 Smoothing: 26 Face 179: A:89 B:101 C:102 AB:1 BC:1 CA:0 Smoothing: 26 Face 180: A:90 B:103 C:91 AB:0 BC:1 CA:1 Smoothing: 27 Face 181: A:90 B:102 C:103 AB:1 BC:1 CA:0 Smoothing: 27 Face 182: A:91 B:104 C:92 AB:0 BC:1 CA:1 Smoothing: 28 Face 183: A:91 B:103 C:104 AB:1 BC:1 CA:0 Smoothing: 28 Face 184: A:92 B:105 C:93 AB:0 BC:1 CA:1 Smoothing: 29 Face 185: A:92 B:104 C:105 AB:1 BC:1 CA:0 Smoothing: 29 Face 186: A:93 B:106 C:94 AB:0 BC:1 CA:1 Smoothing: 30 Face 187: A:93 B:105 C:106 AB:1 BC:1 CA:0 Page 9 Smoothing: 30 Face 188: A:94 B:107 C:95 AB:0 BC:1 CA:1 Smoothing: 31 Face 189: A:94 B:106 C:107 AB:1 BC:1 CA:0 Smoothing: 31 Face 190: A:95 B:96 C:84 AB:0 BC:1 CA:1 Smoothing: 32 Face 191: A:95 B:107 C:96 AB:1 BC:1 CA:0 Smoothing: 32 Face 192: A:96 B:109 C:97 AB:0 BC:1 CA:1 Smoothing: 1 Face 193: A:96 B:108 C:109 AB:1 BC:1 CA:0 Smoothing: 1 Face 194: A:97 B:110 C:98 AB:0 BC:1 CA:1 Smoothing: 2 Face 195: A:97 B:109 C:110 AB:1 BC:1 CA:0 Smoothing: 2 Face 196: A:98 B:111 C:99 AB:0 BC:1 CA:1 Smoothing: 3 Face 197: A:98 B:110 C:111 AB:1 BC:1 CA:0 Smoothing: 3 Face 198: A:99 B:112 C:100 AB:0 BC:1 CA:1 Smoothing: 4 Face 199: A:99 B:111 C:112 AB:1 BC:1 CA:0 Smoothing: 4 Face 200: A:100 B:113 C:101 AB:0 BC:1 CA:1 Smoothing: 5 Face 201: A:100 B:112 C:113 AB:1 BC:1 CA:0 Smoothing: 5 Face 202: A:101 B:114 C:102 AB:0 BC:1 CA:1 Smoothing: 6 Face 203: A:101 B:113 C:114 AB:1 BC:1 CA:0 Smoothing: 6 Face 204: A:102 B:115 C:103 AB:0 BC:1 CA:1 Smoothing: 7 Face 205: A:102 B:114 C:115 AB:1 BC:1 CA:0 Smoothing: 7 Face 206: A:103 B:116 C:104 AB:0 BC:1 CA:1 Smoothing: 8 Face 207: A:103 B:115 C:116 AB:1 BC:1 CA:0 Smoothing: 8 Face 208: A:104 B:117 C:105 AB:0 BC:1 CA:1 Smoothing: 9 Face 209: A:104 B:116 C:117 AB:1 BC:1 CA:0 Smoothing: 9 Face 210: A:105 B:118 C:106 AB:0 BC:1 CA:1 Smoothing: 10 Face 211: A:105 B:117 C:118 AB:1 BC:1 CA:0 Smoothing: 10 Face 212: A:106 B:119 C:107 AB:0 BC:1 CA:1 Smoothing: 11 Face 213: A:106 B:118 C:119 AB:1 BC:1 CA:0 Smoothing: 11 Face 214: A:107 B:108 C:96 AB:0 BC:1 CA:1 Smoothing: 12 Face 215: A:107 B:119 C:108 AB:1 BC:1 CA:0 Smoothing: 12 Face 216: A:108 B:121 C:109 AB:0 BC:1 CA:1 Smoothing: 13 Face 217: A:108 B:120 C:121 AB:1 BC:1 CA:0 Smoothing: 13 Page 10 Face 218: A:109 B:122 C:110 AB:0 BC:1 CA:1 Smoothing: 14 Face 219: A:109 B:121 C:122 AB:1 BC:1 CA:0 Smoothing: 14 Face 220: A:110 B:123 C:111 AB:0 BC:1 CA:1 Smoothing: 15 Face 221: A:110 B:122 C:123 AB:1 BC:1 CA:0 Smoothing: 15 Face 222: A:111 B:124 C:112 AB:0 BC:1 CA:1 Smoothing: 16 Face 223: A:111 B:123 C:124 AB:1 BC:1 CA:0 Smoothing: 16 Face 224: A:112 B:125 C:113 AB:0 BC:1 CA:1 Smoothing: 17 Face 225: A:112 B:124 C:125 AB:1 BC:1 CA:0 Smoothing: 17 Face 226: A:113 B:126 C:114 AB:0 BC:1 CA:1 Smoothing: 18 Face 227: A:113 B:125 C:126 AB:1 BC:1 CA:0 Smoothing: 18 Face 228: A:114 B:127 C:115 AB:0 BC:1 CA:1 Smoothing: 19 Face 229: A:114 B:126 C:127 AB:1 BC:1 CA:0 Smoothing: 19 Face 230: A:115 B:128 C:116 AB:0 BC:1 CA:1 Smoothing: 20 Face 231: A:115 B:127 C:128 AB:1 BC:1 CA:0 Smoothing: 20 Face 232: A:116 B:129 C:117 AB:0 BC:1 CA:1 Smoothing: 21 Face 233: A:116 B:128 C:129 AB:1 BC:1 CA:0 Smoothing: 21 Face 234: A:117 B:130 C:118 AB:0 BC:1 CA:1 Smoothing: 22 Face 235: A:117 B:129 C:130 AB:1 BC:1 CA:0 Smoothing: 22 Face 236: A:118 B:131 C:119 AB:0 BC:1 CA:1 Smoothing: 23 Face 237: A:118 B:130 C:131 AB:1 BC:1 CA:0 Smoothing: 23 Face 238: A:119 B:120 C:108 AB:0 BC:1 CA:1 Smoothing: 24 Face 239: A:119 B:131 C:120 AB:1 BC:1 CA:0 Smoothing: 24 Face 240: A:120 B:133 C:121 AB:0 BC:1 CA:1 Smoothing: 25 Face 241: A:120 B:132 C:133 AB:1 BC:1 CA:0 Smoothing: 25 Face 242: A:121 B:134 C:122 AB:0 BC:1 CA:1 Smoothing: 26 Face 243: A:121 B:133 C:134 AB:1 BC:1 CA:0 Smoothing: 26 Face 244: A:122 B:135 C:123 AB:0 BC:1 CA:1 Smoothing: 27 Face 245: A:122 B:134 C:135 AB:1 BC:1 CA:0 Smoothing: 27 Face 246: A:123 B:136 C:124 AB:0 BC:1 CA:1 Smoothing: 28 Face 247: A:123 B:135 C:136 AB:1 BC:1 CA:0 Smoothing: 28 Face 248: A:124 B:137 C:125 AB:0 BC:1 CA:1 Page 11 Smoothing: 29 Face 249: A:124 B:136 C:137 AB:1 BC:1 CA:0 Smoothing: 29 Face 250: A:125 B:138 C:126 AB:0 BC:1 CA:1 Smoothing: 30 Face 251: A:125 B:137 C:138 AB:1 BC:1 CA:0 Smoothing: 30 Face 252: A:126 B:139 C:127 AB:0 BC:1 CA:1 Smoothing: 31 Face 253: A:126 B:138 C:139 AB:1 BC:1 CA:0 Smoothing: 31 Face 254: A:127 B:140 C:128 AB:0 BC:1 CA:1 Smoothing: 32 Face 255: A:127 B:139 C:140 AB:1 BC:1 CA:0 Smoothing: 32 Face 256: A:128 B:141 C:129 AB:0 BC:1 CA:1 Smoothing: 1 Face 257: A:128 B:140 C:141 AB:1 BC:1 CA:0 Smoothing: 1 Face 258: A:129 B:142 C:130 AB:0 BC:1 CA:1 Smoothing: 2 Face 259: A:129 B:141 C:142 AB:1 BC:1 CA:0 Smoothing: 2 Face 260: A:130 B:143 C:131 AB:0 BC:1 CA:1 Smoothing: 3 Face 261: A:130 B:142 C:143 AB:1 BC:1 CA:0 Smoothing: 3 Face 262: A:131 B:132 C:120 AB:0 BC:1 CA:1 Smoothing: 4 Face 263: A:131 B:143 C:132 AB:1 BC:1 CA:0 Smoothing: 4 Face 264: A:132 B:145 C:133 AB:0 BC:1 CA:1 Smoothing: 5 Face 265: A:132 B:144 C:145 AB:1 BC:1 CA:0 Smoothing: 5 Face 266: A:133 B:146 C:134 AB:0 BC:1 CA:1 Smoothing: 6 Face 267: A:133 B:145 C:146 AB:1 BC:1 CA:0 Smoothing: 6 Face 268: A:134 B:147 C:135 AB:0 BC:1 CA:1 Smoothing: 7 Face 269: A:134 B:146 C:147 AB:1 BC:1 CA:0 Smoothing: 7 Face 270: A:135 B:148 C:136 AB:0 BC:1 CA:1 Smoothing: 8 Face 271: A:135 B:147 C:148 AB:1 BC:1 CA:0 Smoothing: 8 Face 272: A:136 B:149 C:137 AB:0 BC:1 CA:1 Smoothing: 9 Face 273: A:136 B:148 C:149 AB:1 BC:1 CA:0 Smoothing: 9 Face 274: A:137 B:150 C:138 AB:0 BC:1 CA:1 Smoothing: 10 Face 275: A:137 B:149 C:150 AB:1 BC:1 CA:0 Smoothing: 10 Face 276: A:138 B:151 C:139 AB:0 BC:1 CA:1 Smoothing: 11 Face 277: A:138 B:150 C:151 AB:1 BC:1 CA:0 Smoothing: 11 Face 278: A:139 B:152 C:140 AB:0 BC:1 CA:1 Smoothing: 12 Page 12 Face 279: A:139 B:151 C:152 AB:1 BC:1 CA:0 Smoothing: 12 Face 280: A:140 B:153 C:141 AB:0 BC:1 CA:1 Smoothing: 13 Face 281: A:140 B:152 C:153 AB:1 BC:1 CA:0 Smoothing: 13 Face 282: A:141 B:154 C:142 AB:0 BC:1 CA:1 Smoothing: 14 Face 283: A:141 B:153 C:154 AB:1 BC:1 CA:0 Smoothing: 14 Face 284: A:142 B:155 C:143 AB:0 BC:1 CA:1 Smoothing: 15 Face 285: A:142 B:154 C:155 AB:1 BC:1 CA:0 Smoothing: 15 Face 286: A:143 B:144 C:132 AB:0 BC:1 CA:1 Smoothing: 16 Face 287: A:143 B:155 C:144 AB:1 BC:1 CA:0 Smoothing: 16 Face 288: A:144 B:157 C:145 AB:0 BC:1 CA:1 Smoothing: 17 Face 289: A:144 B:156 C:157 AB:1 BC:1 CA:0 Smoothing: 17 Face 290: A:145 B:158 C:146 AB:0 BC:1 CA:1 Smoothing: 18 Face 291: A:145 B:157 C:158 AB:1 BC:1 CA:0 Smoothing: 18 Face 292: A:146 B:159 C:147 AB:0 BC:1 CA:1 Smoothing: 19 Face 293: A:146 B:158 C:159 AB:1 BC:1 CA:0 Smoothing: 19 Face 294: A:147 B:160 C:148 AB:0 BC:1 CA:1 Smoothing: 20 Face 295: A:147 B:159 C:160 AB:1 BC:1 CA:0 Smoothing: 20 Face 296: A:148 B:161 C:149 AB:0 BC:1 CA:1 Smoothing: 21 Face 297: A:148 B:160 C:161 AB:1 BC:1 CA:0 Smoothing: 21 Face 298: A:149 B:162 C:150 AB:0 BC:1 CA:1 Smoothing: 22 Face 299: A:149 B:161 C:162 AB:1 BC:1 CA:0 Smoothing: 22 Face 300: A:150 B:163 C:151 AB:0 BC:1 CA:1 Smoothing: 23 Face 301: A:150 B:162 C:163 AB:1 BC:1 CA:0 Smoothing: 23 Face 302: A:151 B:164 C:152 AB:0 B