z80 zsim8080zimplib lxcall iprint ipredef itest iprutilsiftest iform ifmt i 0?'В 0?zЩ6% _0?·Вѕ Ж0?аБL ­0?ЭБ 0?шЕE 0?ЁЖК }0?Q·a*HR0?YY) H10?уъo. %begin %integer %fn stoi(%string(255) s) %integer i, n = 0 %for i = 1, 1, LENGTH(s) %cycle n = n*10+charno(s,i)-'0' %repeat %result = n %end %integer cur dest = 0 {vdu} %external %integer %fn %spec Proc ID (%routine X) %external %routine %spec Stop(%integer res) %external %integer %fn %spec Verbosity Required(%integer Handle) %external %integer %fn %spec ArgumentInit(%c %integer %name Handle, %string(255) keyString, %integer Input wanted, Output wanted, %string(255) Identification, %integer Help proc) %external %integer %fn %spec XGetPresence(%c %string(255) key, %integer Handle) %external %integer %fn %spec XGetCardinalArg(%c %string(255) key, %integer Index, %integer Handle) %external %integer %fn %spec XGetStringArg(%c %string(*) %name argument, %string(255) Key, %integer Index, handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer handle) %integer c, y, x, i, j, string length, handle, result, width, count, verbosity level %string(255) file, header %external %integerfn %spec XOsByte(%integername y,c, %integer a,x,yin) %routine pch(%byte ch) *movb_ch,1 *svc_1 %end %routine oswrch(%byte ch); ! To vdu %if curdest # 0 %then pch(3) %and curdest = 0 pch(ch) p %start preddfd(ts,vs) ddfd(ts,vs,hl) ->no %unless vs=hl plant(16_e3) %finishelseif vs=af=vd %start ->no %unless td=longreg plant(8) %finishelseif td=longreg %start ->no %unless vs=hl %and vd=de plant(16_eb) %finishel %else pr(1); pr(i) %finish %end %routine esc(%integer i) b(27); b(i) %end %routine litchar(%byte i) esc('I');b(1);b(i);esc('I');b(0) %end %routine pv(%integer minlev, %string(255) s) %integer i %if verbosity level < minlev %then %return plant(op+6) %finishelseif t=rref %and v=hl %start %if op&16_40#0 %start plant(16_ed); plant(op) %finishelsestart plant(16_cb); plant(op+6) %finish %finishelseif t=reg %start plant(16_cb); plant(op+v) %finishelse faul Comments") pv(0, " -Input file1,file2,...") pv(0, " -Serial/-Net/-Parallel override !Config value of printer type") pv(0, " -ff initial page throw") pv(0, "") pv(0, " Print looks at global variables USER$ID, USER$NAME, and USER$LOCATION") pv(0, " for informtion when printing banner headers.") pv(0, "") %end %const %integer buffsize = (46+2)*128+1024{spillage} %byte %array buffer(0:buffsize) %external %integer %fn %spec LoadFile(%string(255) File, %integer a, b) %predicate load fount(%string(255) file, %integer address, %integername fixed) %string(255) z fixed = 0 %if LoadFile(file, buffsize, address) >= 0 %then %start %if file -> z.(".pica") %then fixed=1 %true %finish %else %false %end %routine perform action(%string(255) s, p) %integer i, fixed %if s = "ignore" %start !-------------------------------------------------------------- %else %if s = "lowset" esc('5') ;! see esc % and fix!!!!!! %else %if %integer Help proc) %external %integer %fn %spec XGetPresence(%c %string(255) key, %integer Handle) %external %integer %fn %spec XGetCardinalArg(%c %string(255) key, %integer Index, %integer Handle) %external %integer %fn %spec XGetStringArg(------------------------------- %else %if s = "reset" ! esc('@') !-------------------------------------------------------------- %else %if s = "lit" esc('I');b(1);b(stoi(p));esc('I');b(0) %else %if s = "load" %if p = "std.pica" %then %sosity level %string(255) file, header %external %integerfn %spec XOsByte(%integername y,c, %integer a,x,yin) %routine pch(%byte ch) *movb_ch,1 *svc_1 %end %routine oswrch(%byte ch); ! To vdu %if curdest # 0 %then pch(3) %and curdest = 0 pch(ch) ('(') esc('%');b(1);b(0) esc('R');b(0) %if fixed=0 %then esc('p') %and b(1) esc('&');b(0);b(0);b(127) %for i = 0, 1, (46+2)*128-1 %cycle b(buffer(i)) %repeat pv(1, "Done.".snl) %else pv(0, "Error: %else pr(1); pr(i) %finish %end %routine esc(%integer i) b(27); b(i) %end %routine litchar(%byte i) esc('I');b(1);b(i);esc('I');b(0) %end %routine pv(%integer minlev, %string(255) s) %integer i %if verbosity level < minlev %then %return ---------- %else %if s = "sub" esc('S');b(1); ! Can't in NLQ mode - remember & restore! %else %if s = "cansub" esc('T') !-------------------------------------------------------------- %else %if s = "sup" esc('S');b(0) %else %if s = "cansup" esc('T') !-------------------------------------------------------------- %else %if s = "ps" esc('p');b(1) %else %if s = "fixed" esc('p');b(0) !-------------------------------------------------------------- %else %if global variables USER$ID, USER$NAME, and USER$LOCATION") pv(0, " for informtion when printing banner headers.") pv(0, "") %end %const %integer buffsize = (46+2)*128+1024{spillage} %byte %array buffer(0:buffsize) %external %integer %fn %spec LoadFile(--------------------------------------------------- %else %if s = "large" {expanded} esc('W');b(1) %else %if s = "canlarge" esc('W');b(0) !-------------------------------------------------------------- %else %if s = "lines" !---------------sh %else %false %end %routine perform action(%string(255) s, p) %integer i, fixed %if s = "ignore" %start !-------------------------------------------------------------- %else %if s = "lowset" esc('5') ;! see esc % and fix!!!!!! %else %if---------------------------- %else %if s = "emp" esc('E') %else %if s = "canemp" esc('F') !-------------------------------------------------------------- %else %if s = "double" esc('G') %else %if s = "candouble" esc('H') !--------------------------------------- %else %if s = "reset" ! esc('@') !-------------------------------------------------------------- %else %if s = "lit" esc('I');b(1);b(stoi(p));esc('I');b(0) %else %if s = "load" %if p = "std.pica" %then %s } !-------------------------------------------------------------- %else %if s = "paper" !-------------------------------------------------------------- %else %if s = "char" !-------------------------------------------------------------- %else %if s = "cr" b(13) !-------------------------------------------------------------- %else %if s = "comment" !-------------------------------------------------------------- %else pv(0,"Error: unknown command \".s."{}".snl) %finish !-------------------------------------------------------------- %end %routine Transfer(%integer files remaining) %string(255) s, p %string(255) %array com(0:16), par(0:16) %integer i, Y, C, tot = 0, col = 0, pending action = 0 %switch sw(0:255) %while %not end of input %cycle readsymbol(i) %if i = '}' %start %if pending action=0 %then %start b(i) pv(1, "Warning: \ missing on }".snl) %else perform action(com(pending action), par(pending action)) pending action = pendingse %if s = "cansup" esc('T') !-------------------------------------------------------------- %else %if s = "ps" esc('p');b(1) %else %if s = "fixed" esc('p');b(0) !-------------------------------------------------------------- %else %if t RAM fount perform action("highset", ""); -> done sw('+'): ! Select NLQ fount perform action("nlq", ""); -> done sw('-'): ! Select low quality fount perform action("pica", ""); -> done sw('<'): ! Swicth to ROM fount per--------------------------------------------------- %else %if s = "large" {expanded} esc('W');b(1) %else %if s = "canlarge" esc('W');b(0) !-------------------------------------------------------------- %else %if s = "lines" !--------------- s = "" %cycle s <- s.i %exit %if %not ('a' <= next symbol <= 'z') readsymbol(i) %repeat %if s = "lit" %or s = "load" %or s = "country" %or s = "paper" %c %or s = "char" %or s = "comment" %c %or s = "lines" %or s = "backspace" %c %then %start ! These all take short parameters %if next symbol='{' %start skipsymbol p = "" %cycle readsymbol(i) %exit %if i = '}' p <- p.i %repeat %finish %else p = "" Perform action(s, p) %else ! These all take either no parameters (optional {}) or a block ! or are unrecognised codes ! All the following commands DO take block parameters ! and set up modes - so stack command to unset modes %if s = "sub" %or s = "sup" %or s = "small" %or s = "large" %c %or s = "ul" %or s = "emp" %or s = "double" %then %start perform action(s, p) p = s; s = "can".s; ! Note that \ul with NO {} turns underlining on indefinitely! %if next symbol = '{' %then %start skipsymbol pending action = pending action + 1 com(pending action) = s; par(pending action) = --------------------------------------------- %end %routine Transfer(%integer files remaining) %string(255) s, p %string(255) %array com(0:16), par(0:16) %integer i, Y, C, tot = 0, col = 0, pending action = 0 %switch sw(0:255) %while %not end of input pending action + 1 com(pending action) = s; par(pending action) = p %finish %finish %finish %finish done: %repeat %if files remaining > 0 %start b(nl);b(nl) b('-') %for i = 0,1,79 b(nl);b(nl) %finish %else b(12) b(10) %end %routine initialise printer ! Don't do esc @ because it fucks up the forms!!! b(17) esc('!');b(0) esc('('); ! nlq esc('%');b(1);b(0) esc(':');b(0);b(0);b(0) {Copy high-res rom -> ram} esc('%');b(0);b(0) esc('P'); ! pica esc(':');b(0);b(0);b(0) {Copy low-res rom -> ram} esc('2'); {default 1/6" line spacing} esc('C');b(0);b(12) esc('N');b(2); esc('D');b(0) esc('B');b(0) esc('b');b(0) esc('/');b(0) esc('Q');b(80) esc('l');b(0) esc('I');b(0) esc('6') esc('R');b(0) esc('#') esc('s');b(0) esc('i');b(0) esc('U');b(0) %if XGetPresence("ff", handle) # 0 %then b(12) %if XGetPresence("NoPerfSkip", handle) # 0 %then %start esc('O') %finish %end %on %event 9 %start pv(0, "Printing abandoned - IO error (input file does not exist perhaps?") stop(event_extra) %finish result = ArgumentInit(%c handle, "INput=FROM=FILEs/?/A/E-lis ". %c "SERial/K/P/=0 NETwork=ECOnet/K/P/=0 PARallel/K/P/=0 ". %c "NOPERFSKIP/K/P/=0 ". %c "FF/K/P/=0", 0 , 0, "Canon/Kaga-Taxan formatting utility V1.0.0", Proc ID(Help)) %if result < 0 %then Stop(result) x = XOsByte(Y, C, 3, 0, 0) oswrch(2); curdest = 1 ;!--------------------- p.i %repeat %finish %else p = "" Perform action(s, p) %else ! These all take either no parameters (optional {}) or a block ! or are unrecognised codes ! All the following commands DO take block parametif XGetPresence("Parallel", handle) # 0 pv(1, "Selecting PARALLEL printer") %else pv(1, "Using default printer (from !Config)") %finish initialise printer count = XGetNumberOfValues("Input", handle) %for i = 1, 1, count %cycle strin"can".s; ! Note that \ul with NO {} turns underlining on indefinitely! %if next symbol = '{' %then %start skipsymbol pending action = pending action + 1 com(pending action) = s; par(pending action) = sfer(count-i) %repeat oswrch(3);!----------------------------------------------------- OFF %endofprogram pending action + 1 com(pending action) = s; par(pending action) = p %finish %finish %finish %finish done: %repeat %if files remaining > 0 %start b(nl);b(nl) b('-') %for i = 0,1,79 b(nl);b(nl) %finiser for KAGA/TAXAN (Canon) printer ! - uses facilities of printer only - no fancy ! justification or similar. Prepare files ! using VIEW or EDIT, and add print control to ! final proofed copy. In spite of the simplicity ! of this scheme, the results are remarkably good. ! The general form of a formatting command is ! \command{parameters} ! which may be abbreviated to ! \command ! when there are no parameters, and when the command is not ! direcc('6') esc('R');b(0) esc('#') esc('s');b(0) esc('i');b(0) esc('U');b(0) %if XGetPresence("ff", handle) # 0 %then b(12) %if XGetPresence("NoPerfSkip", handle) # 0 %then %start esc('O') %finish %end %on %event 9 %start pv(0, "Printparameters, such as \bold{This text ! is all in a bold fount}, or \ul{and this text is all underlined}. ! Most commands take no parameters at all, such as \date{}, or \theta{}. ! Commands which take groups effectively set a mode for the duration K/P/=0 ". %c "FF/K/P/=0", 0 , 0, "Canon/Kaga-Taxan formatting utility V1.0.0", Proc ID(Help)) %if result < 0 %then Stop(result) x = XOsByte(Y, C, 3, 0, 0) oswrch(2); curdest = 1 ;!---------------------r groups of commands and ! text nested ad nauseam. ! Most commands of this type can also be used without giving ! parameters of any kind, in which case the mode will be set until ! it is explicitly changed. ! \nlq For instance, all the texif XGetPresence("Parallel", handle) # 0 pv(1, "Selecting PARALLEL printer") %else pv(1, "Using default printer (from !Config)") %finish initialise printer count = XGetNumberOfValues("Input", handle) %for i = 1, 1, count %cycle strinsymbol may be included by quoting it with \ (i.e. '\}') ! Externals %external %integer %fn %spec Proc ID (%routine X) %external %integer %fn %spec XOsByte(%integername y,c, %integer a,x,yin) %external %integer %fn %spec LoadFile(%string(255) File, %integer a, b) %external %integer %fn %spec XArgumentInit(%c %string(255) keyString, %integer Input wanted, Output wanted, %string(255) Identification, %integer Help proc) %external %integer %fn %spec Verbosity Required(%integer Handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer handle) %external %integer %fn %spec XGetPresence(%c %string(255) key, %integer Handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer handle) ! Special IO system to force write to printer (no rawprinter: yet) %routine prepare vdu %integer X, Y, X X = XOsByte(Y, C, 3, 0, 0) %end %routine oswrch(%byte ch) *movb_ch,1 *svc_1 %end %routine vdu(%byte ch); ! To vdu %if curdest # 0 %then pch(3) %ae results are remarkably good. ! The general form of a formatting command is ! \command{parameters} ! which may be abbreviated to ! \command ! when there are no parameters, and when the command is not ! direc! Assume *FX 6,0 set... x = XOsByte(Y, C, 6, 255, 0) ;! so change printer ignore char when printer(1); printer(i); ! data to be printed is 0 x = XOsByte(Y, C, 6, 0, 0) %else printer(1); printer(i) %finish %end %routine esc(%iparameters, such as \bold{This text ! is all in a bold fount}, or \ul{and this text is all underlined}. ! Most commands take no parameters at all, such as \date{}, or \theta{}. ! Commands which take groups effectively set a mode for the duration cle; vdu(charno(s,i)); %repeat vdu(13);vdu(10) %end ! Command line decoding %routine Compiler bug fix(%string(255) %name file) %integer j %for j = string length, -1, 1 %cycle charno(file, j) = charno(file, j-1) %repeat length(file) = string length %end %routine Help pv(0, "") pv(0, " Form: formats files on Canon/Kaga-Taxan compatible printers") pv(0, "") pv(0, " Parameter Comments") pv(0, "") pv(0, " -Input file1,file2,... Main ource & macro include files") pv(0, " -ff initial page throw wanted") pv(0, " -noperfskip don't skip over perforation") pv(0, "") pv(0, " Print looks at global variables USER$ID, USER$NAME, and USER$LOCATION") pv(0, " for informtion when printing banner headers.") pv(0, "") %end handle = XArgumentInit(%c "INput=FROM=FILEs/?/A/E-lis ". %c "NOPERFSKIP/K/P/=0 ". %c "FF/K/P/=0", 0, 0, "Canon/Kaga-Taxan formatting utility V2.0.0", Proc ID(Help)) %external %routine %spec Stop(%integer res) %on %event 9 %start pv(0, "Formatting abandoned - file ".file." does not exist perhaps?") stop(event_extra) %finish count = XGetNumeger %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer handle) %external %integer %fn %spec XGetPresence(%c %string(255) key, %integer Handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer handle) ! Special IO system to force write to printer (no rawprinter: yet) %routine prepare vdu %integer X, Y, X X = XOsByte(Y, C, 3, 0, 0) %end %routine oswrch(%byte ch) *movb_ch,1 *svc_1 %end %routine vdu(%byte ch); ! To vdu %if curdest # 0 %then pch(3) %a trimmed exactly} %byte %array buffer(0:buffsize) %predicate load fount(%string(255) file, %string(255) %name fount, %integer address, %integername fixed) ! If the fount loaded was NOT proportionally spaced, then fixed is set to 1 ! (1 is true, 0 false) fixed = 0 %if LoadFile(file, buffsize, address) >= 0 %then %start %if file -> fount.(".pica") %then fixed=1 %true %finish %else %false %end ! State variables %constant %integer %c fixed = 0, proportional = 1, draft = 0, nlq = 1, pica = 0, elite = 1, bold = 1, double = 2, wide = 4, italic = 8, sub = 16, sup = 32 %string(255) fount = "std" %integer quality = draft, pitch = pica, style = 0, spacing = fixed ! Command stucture tables %const %integer Last command = 99 %string %array Command(1:Last command*2) = %c "std", "endfount", "fount", "endfount", { it off again later } "draft", "endres", { Changing the resolution from draft to nlq } "nlq", "endres", "pica", "endpitch", { Character pitch in chars/inch } "elite", "endpitch", "bold", "endstyle", { Type-faces available. Some founts can't } "double", "endstyle", { manage so may have to switch founts to } "narrow", "endstyle", { get required results ude files") pv(0, " -ff initial page throw wanted") pv(0, " -noperfskip don't skip over perforation") pv(0, "") pv(0, " Print looks at global variables USER$ID, USER$NAME, and USER$LOCATION") pv( "endstyle", { NLQ has special fount we can use } "overlay", "ignore", { Commands with string parameters } "backspace", "ignore", defchar { extract 1 char from fount and store somewhere } "char", "ignore", "tab", "ignora-Taxan formatting utility V2.0.0", Proc ID(Help)) %external %routine %spec Stop(%integer res) %on %event 9 %start pv(0, "Formatting abandoned - file ".file." does not exist perhaps?") stop(event_extra) %finish count = XGetNumard listing endlisting widelisting endwidelisting "0", "1", "+", "-", "<", ">", "^", ".", "(", ")", "[", "]", "*", "/", "@", "-", "%", {underline} "`", "'", "{", "}", " ", defmacro centre para indent footnote reference list paper lines country comment "endfount", "ignore", "endres", "ignore", "endpitch", "ignore", "endstyle", "ignore", "ignore" "ignore" ! The system has to cope with cases such as..._ ! \fount{outline}\nlq\pica ! \low\pica ! \std\pica ! ! \nlq\italic\pica ! \nlq\italic\elite ! \low\italic\elite %begin %external %string(255) %spec curfount %integer %fn stoi(%string(255) s) %integer i, n = 0 s -> (" ").s %while LENGTH(s)>0 %and CHARNO(s,1) = ' ' %if CHARNO(s,1) = '''' %start %result = CHARNO(s,2) %finish %for i = 1, 1, LENGTH(s) %cycle pica = 0, elite = 1, bold = 1, double = 2, wide = 4, italic = 8, sub = 16, sup = 32 %string(255) fount = "std" %integer quality = draft, pitch = pica, style = 0, spacing = fixed ! Command stucture tables %const %integer Last command = 99 %string %a %external %integer %fn %spec ArgumentInit(%c %integer %name Handle, %string(255) keyString, %integer Input wanted, Output wanted, %string(255) Identification, %integer Help proc) %external %integer %fn %spec XGetPresence(%c %string(255) key, { Character pitch in chars/inch } "elite", "endpitch", "bold", "endstyle", { Type-faces available. Some founts can't } "double", "endstyle", { manage so may have to switch founts to } "narrow", "endstyle", { get required results ) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer handle) %integer c, y, x, i, j, string length, handle, result, width, count %external %integer %spec verbosity level %string(255) file, header %external %routine %spe "endstyle", { NLQ has special fount we can use } "overlay", "ignore", { Commands with string parameters } "backspace", "ignore", defchar { extract 1 char from fount and store somewhere } "char", "ignore", "tab", "ignorCanon/Kaga-Taxan compatible printers") pv(0, "") pv(0, " Parameter Comments") pv(0, " -Input file1,file2,...") pv(0, " -Serial/-Net/-Parallel override !Config value of printer type") pv(0, " -ff initial page throw") pv(0, "") pv(0, " Print looks at global variables USER$ID, USER$NAME, and USER$LOCATION") pv(0, " for informtion when printing banner headers.") pv(0, "") %end %external %routine %spec cache fount(%string(255) p)ent "endfount", "ignore", "endres", "ignore", "endpitch", "ignore", "endstyle", "ignore", "ignore" "ignore" ! The system has to cope with cases such as..._ ! \fount{outline}\nlq\pica ! \low\pica ! \std\pica ! ! \nlq\italic\pica ! \nstring(255) lows, highs %if s = "ignore" %start !-------------------------------------------------------------- %else %if s = "gentab" gentab !-------------------------------------------------------------- %else %if s = "lowset" esc('5') %begin %external %string(255) %spec curfount %integer %fn stoi(%string(255) s) %integer i, n = 0 s -> (" ").s %while LENGTH(s)>0 %and CHARNO(s,1) = ' ' %if CHARNO(s,1) = '''' %start %result = CHARNO(s,2) %finish %for i = 1, 1, LENGTH(s) %cycle(1);b(0) !-------------------------------------------------------------- %else %if s = "reset" ! esc('@') !-------------------------------------------------------------- %else %if s = "lit" esc('I');b(1);b(stoi(p));esc('I');b(0) %else %if %external %integer %fn %spec ArgumentInit(%c %integer %name Handle, %string(255) keyString, %integer Input wanted, Output wanted, %string(255) Identification, %integer Help proc) %external %integer %fn %spec XGetPresence(%c %string(255) key, ----------------------------- %else %if s = "sub" esc('S');b(1); ! Can't in NLQ mode - remember & restore! %else %if s = "cansub" esc('T') !-------------------------------------------------------------- %else %if s = "sup" esc('S');b(0) %else %if s = "cansup" esc('T') !-------------------------------------------------------------- %else %if s = "ps" esc('p');b(1) %else %if s = "fixed" esc('p');b(0) !-------------------------------------------------------------- %else %if s = "nlq" esc('(') %else %if s = "pica" esc('P') %else %if s = "elite" esc('M') !-------------------------------------------------------------- %else %if s = "small" {condensed} b(15) %else %if s = "cansmall" b(18) !-------------------------------------------------------------- %else %if s = "large" {expanded} esc('W');b(1) %else %if s = "canlarge" esc('W');b(0) !-------------------------------------------------------------- %else %if s = "lines" !-------------------------------------------------------------- %else %if s = "backspace" !-------------------------------------------------------------- %else %if s = "ul" esc('-');b(1) %else %if s = "canul" esc('-');b(0) !-------------------------------------------------------------- %else %if s = "emp" esc('E') %else %if s = "canemp" esc('F') !-------------------------------------------------------------- %else %if s = "double" esc('G') %else %if s = "candouble" string(255) lows, highs %if s = "ignore" %start !-------------------------------------------------------------- %else %if s = "gentab" gentab !-------------------------------------------------------------- %else %if s = "lowset" esc('5') Need to remember??? } !-------------------------------------------------------------- %else %if s = "paper" !-------------------------------------------------------------- %else %if s = "char" !-------------------------------------------------------------- %else %if s = "cr" b(13) !-------------------------------------------------------------- %else %if s = "comment" !-------------------------------------------------------------- %else pv(0,"Error: unknown command \".s."{}".snl) %finish !-------------------------------------------------------------- %end %routine Transfer(%integer files remaining) %string(255) s, p %string(255) %array com(0:16), par(0:16) %integer i, Y, C, tot = 0, col = 0, pending action = 0 %switch sw(0:255) %while %not end of input %cycle readsymbol(i) %if i = '}' %start %if pending action=0 %then %start b(i) pv(1, "Warning: \ missing on }".snl) %else perform action(com(pending action), par(pending action)) pending action = pending action - 1 ! Turn off any modes set using \mode{ text group } %finish %else %if i # '\' %then b(i) %else readsymbol(i) -> sw(i) sw('0'): ! Select ROM fount perform action("lowset", ""); -> done ----- %else %if s = "nlq" esc('(') %else %if s = "pica" esc('P') %else %if s = "elite" esc('M') !-------------------------------------------------------------- %else %if s = "small" {condensed} b(15) %else %if s = "cansmall" ROM fount perform action("romfount", ""); -> done sw('>'): ! Switch to RAM fount perform action("ramfount", ""); -> done sw('\'): sw('{'): sw('}'): sw(' '): b(i); -> done sw(NL): -> done { ignore \s on end of line, ignore newline tos" !-------------------------------------------------------------- %else %if s = "backspace" !-------------------------------------------------------------- %else %if s = "ul" esc('-');b(1) %else %if s = "canul" esc('-');b(0) !--------------- %or s = "char" %or s = "comment" %c %or s = "lines" %or s = "backspace" %c %then %start ! These all take short parameters %if next symbol='{' %start skipsymbol p = "" %cycle readsymbol(i) %exit %if i = '}' p <- p.i %repeat %finish %else p = "" Perform action(s, p) %else ! These all take either no parameters (optional {}) or a block ! or are unrecognised codes ! All the following commands DO take block parameters ! and set up modes - so stack command to unset modes %if s = "sub" %or s = "sup" %or s = "small" %or s = "large" %c %or s = "ul" %or s = "emp" %or s = "double" %then %start perform action(s, p) p = s; s = "can".s; ! Note that \ul with NO {} turns underlining on indefinitely! %if next symbol = '{' %then %start skipsymbol pending action = pending action + 1 !-------------------------------------------------------------- %end %routine Transfer(%integer files remaining) %string(255) s, p %string(255) %array com(0:16), par(0:16) %integer i, Y, C, tot = 0, col = 0, pending action = 0 %switch sw(0:255) %while skipsymbol pending action = pending action + 1 com(pending action) = s; par(pending action) = p %finish %finish %finish %finish done: %repeat %if files remaining > 0 %start b(nl);b(nl) ng action = pending action - 1 ! Turn off any modes set using \mode{ text group } %finish %else %if i # '\' %then b(i) %else readsymbol(i) -> sw(i) sw('0'): ! Select ROM fount perform action("lowset", ""); -> done urfount,v1)) %for v1=1,1,length(curfount) b(10) %for v1= 1, 1, 3 %for row = 0, 1, 31 %cycle b(10) %for col = 0, 32, 256-32 %cycle v1 = row+col; b(32) %for v2=0,1,col//4 v2=col+row; b(v2//100+'0') v2=v2-(v2//100*100ROM fount perform action("romfount", ""); -> done sw('>'): ! Switch to RAM fount perform action("ramfount", ""); -> done sw('\'): sw('{'): sw('}'): sw(' '): b(i); -> done sw(NL): -> done { ignore \s on end of line, ignore newline tora) %finish result = ArgumentInit(%c handle, "INput=FROM=FILEs/?/A/E-lis ". %c "SERial/K/P/=0 NETwork=ECOnet/K/P/=0 PARallel/K/P/=0 ". %c "NOPERFSKIP/K/P/=0 ". %c "FF/K/P/=0", 0 , 0, "Canon/Kaga-Taxan formatting utility V1.0.0", Proc ID(Help)) %if result < 0 %then Stop(result) %external %routine %spec start printer; start printer verbosity level = Verbosity Required(handle) %if XGetPresence("Serial", handle) # 0 %then %start %exit %if i = '}' p <- p.i %repeat %finish %else p = "" Perform action(s, p) %else ! These all take either no parameters (optional {}) or a block ! or are unrecognised codes !om !Config)") %finish initialise printer %if XGetPresence("ff", handle) # 0 %then b(12) %if XGetPresence("NoPerfSkip", handle) # 0 %then %start esc('O') %finish count = XGetNumberOfValues("Input", handle) %for i = 1, 1, count %cycle perform action(s, p) p = s; s = "can".s; ! Note that \ul with NO {} turns underlining on indefinitely! %if next symbol = '{' %then %start skipsymbol pending action = pending action + 1 Transfer(count-i) %repeat %external %routine %spec stop printer; stop printer %endofprogram skipsymbol pending action = pending action + 1 com(pending action) = s; par(pending action) = p %finish %finish %finish %finish done: %repeat %if files remaining > 0 %start b(nl);b(nl) = char record length * fount size + 1024 { spillage } %external %byte %array buffer(0:buffsize) %predicate load fount(%string(255) file, %integer address) %external %integer %fn %spec LoadFile(%string(255) File, %integer a, b) %if LoadFile(file, buffsize, address) >= 0 %then %start curfount = file %true %finish %else %false %end %external %integerfn %spec XOsByte(%integername y,c, %integer a,x,yin) %routine pch(%byte ch) *movb_ch,1 *svc_1 %end %external %integer cur dest = 0 %routine oswrch(%byte ch); ! To vdu %if curdest # 0 %then pch(3) %and curdest = 0 pch(ch) %end %external %integer verbosity level %external %routine pv(%integer minlev, %string(255) s) %integer i %if verbosity level < minlev %then %return %for i = 1, 1, length(s) %cycle; oswrch(charno(s,i)); %repeat; oswrch(13);oswrch(10) %end %external %routine start printer %integer y, c, x = XOsByte(Y, C, 3, 0, 0) oswrch(2); curdest = 1 ;!------------------------------------- ON %end %external %routine stop printen formatting utility V1.0.0", Proc ID(Help)) %if result < 0 %then Stop(result) %external %routine %spec start printer; start printer verbosity level = Verbosity Required(handle) %if XGetPresence("Serial", handle) # 0 %then %start x = XOsByte(Y, C, 6, 255, 0) pr(1); pr(i) x = XOsByte(Y, C, 6, 0, 0) %else pr(1); pr(i) %finish %end %external %routine esc(%integer i) b(27); b(i) %end %routine send char(%integer index) %integer i b(buffer(index*char record leom !Config)") %finish initialise printer %if XGetPresence("ff", handle) # 0 %then b(12) %if XGetPresence("NoPerfSkip", handle) # 0 %then %start esc('O') %finish count = XGetNumberOfValues("Input", handle) %for i = 1, 1, count %cycle eger char esc('&');b(0);b(low);b(high) %for char = low, 1, high %cycle send char(char) %repeat %end %external %routine litchar(%byte i) %const %integer %c usa=0,fr=1,ger=2,uk=3,den=4,swe=5,it=6,sp=7,jap=8 %const %byte %array lang(0:31) = %c it,it,it,it,it,it,uk,sp, sp,sp,sp,swe,sp,swe,it,fr, fr,ger,den,den,den,den,sp,swe, ger,swe,swe,swe,swe,swe,fr,jap %const %byte %integer %array trtab(0:31)=%c '{','}','`','|','~','[','#','[',']','\','|','$','#',']','{','\', ']','~','[','{','\','|','{','[','\','^','{','|','~','@','{','\' i = 255 %if i = 127 %if i >= 32 %start esc('6');esc('I');b(1);b(i);esc('I');b(0) %else !select language esc('R');b(lang(i)) b(trtab(i)) esc('R');b(0) !reselect language USA %finish %end %external %routine initialise printer ! Don't do esc @ because it fucks up the forms!!! b(17) esc('!');b(0) esc('('); ! nlq esc('%');b(1);b(0) esc(':');b(0);b(0);b(0) {Copy high-res rom -> ram} esc('%');b(0);b(0) esc('P'); ! pica esc(':');b(0);b(0);b(0) {Copy low-res rom -> ram} esc('2'); {default 1/6" line spacing} esc('C');b(0);b(12) esc('N');b(2); esc('D');b(0) esc('B');b(0) esc('b');b(0) esc('/');b(0) esc('Q');b(80) esc('l');b(0) esc('I');b(0) esc('6') esoswrch(%byte ch); ! To vdu %if curdest # 0 %then pch(3) %and curdest = 0 pch(ch) %end %external %integer verbosity level %external %routine pv(%integer minlev, %string(255) s) %integer i %if verbosity level < minlev %then %return %for i = 1, 1, ln 32016 - NO I/O! %if p = "std.pica" %then %start { fast load } esc('(') esc('%');b(1);b(0) esc('R');b(0) esc(':');b(0);b(0);b(127) %else %if load fount("adfs::0.$.founts.".p, addr(buffer(0))) esc('P');b(32);b(8); ! Force output out to allow change within line esc('(') esc('%');b(1);b(0) esc('R');b(0) %unless p -> base fount.(".pica") %then esc('p') %and b(1) %else ! Copy std fount to ram as emergency measure! esc('(') esc('%');b(1);b(0) esc('R');b(0) esc(':');b(0);b(0);b(127) %finish %end %external %routine def char(%integer from index, to index) esc('&');b(0);b(to index);b(to index) send char(from index) %end %endoffile %begin %external %integer %fn %spec Proc ID (%routine X) %external %routine %spec Stop(%integer res) %external %integer %fn %spec Verbosity Required(%integer Handle) %external %integer %fn %spec ArgumentInit(%c %integer %name Handle, %string(255) keyString, %integer Input wanted, Output wanted, %string(255) Identification, %integer Help proc) %external %integer %fn %spec XGetPresence(%c %string(255) key, %integer Handle) %external %integer %fn %spec XGetCardinalArg(%c %string(255) key, %integer Index, %integer Handle) %external %integer %fn %spec XGetStringArg(%c %string(*) %name argument, %string(255) Key, %integer Index, handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer h|','{','[','\','^','{','|','~','@','{','\' i = 255 %if i = 127 %if i >= 32 %start esc('6');esc('I');b(1);b(i);esc('I');b(0) %else !select language esc('R');b(lang(i)) b(trtab(i)) esc('R');b(0) !reselect language USA %finish Comments") p(" -Input file1,file2,...") p(" -Output printer: by default") p(" -NLQ Letter quality") p(" -Narrow/-Wide") p(" -Width number Normally 80 (Narrowsc(':');b(0);b(0);b(0) {Copy low-res rom -> ram} esc('2'); {default 1/6" line spacing} esc('C');b(0);b(12) esc('N');b(2); esc('D');b(0) esc('B');b(0) esc('b');b(0) esc('/');b(0) esc('Q');b(80) esc('l');b(0) esc('I');b(0) esc('6') esfor informtion when printing banner headers.") p("") %end %routine p(%string(255) s) PrintString(s); Newline %end %routine pv(%integer minlev, %string(255) s) %if verbosity level < minlev %then %return PrintString(s); Newline %end %routine b(%inn 32016 - NO I/O! %if p = "std.pica" %then %start { fast load } esc('(') esc('%');b(1);b(0) esc('R');b(0) esc(':');b(0);b(0);b(127) %else %if load fount("adfs::0.$.founts.".p, addr(buffer(0))) esc('P');b(32);b(8); ! Force outp= ArgumentInit(%c handle, "INput=FROM=FILEs/?/A/E-lis ". %c "OUTput=TO=ON=AT/1/K[rawvdu:] ".%c "SERial/K/P/=0 NETwork=ECOnet/K/P/=0 PARallel/K/P/=0 ". %c "NOPERFSKIP/K/P/=0 ". %c "FF/K/P/=0", 0 , 0, "Epson print utility V1.0.0", Proc ID(Help)) %if result < 0 %then Stop(result) verbosity level = Verbosity Required(handle) %if XGetPresence("Serial", handle) # 0 %then %start pv(1, "Selecting SERIAL printer") %else %if XGetPresenc%begin %external %integer %fn %spec Proc ID (%routine X) %external %routine %spec Stop(%integer res) %external %integer %fn %spec Verbosity Required(%integer Handle) %external %integer %fn %spec ArgumentInit(%c %integer %name Handle, %string(255) e, "Output", 1, handle) %for j = string length, -1, 1 %cycle charno(file, j) = charno(file, j-1) %repeat length(file) = string length Open Binary Output(1, file) %routine vdu(%byte ch) %if ch=255 %start i = XOsByte(Y, C, 6, 0, 0) *movb_ch,, %integer Index, %integer Handle) %external %integer %fn %spec XGetStringArg(%c %string(*) %name argument, %string(255) Key, %integer Index, handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer h %repeat i = XOSByte(Y, C, 3, 4, 0) close output %endofprogram Comments") p(" -Input file1,file2,...") p(" -Output printer: by default") p(" -NLQ Letter quality") p(" -Narrow/-Wide") p(" -Width number Normally 80 (Narrow%prim( 5)%shortmapspec Short(%integer A) %prim( 6)%bytemapspec Byteinteger(%integer A) %prim( 6)%bytemapspec Byte(%integer A) %prim( 7)%realmapspec Real(%integer A) %prim( 8)%longrealmapspec Longreal(%integer A) %prim( 9)%record(*)%mapspec Record(%integer A) %prim(11)%integerfnspec Rem(%integer A, B) %prim(10)%longrealfnspec Float(%longreal R) %prim(12)%bytemapspec Length(%string(255) S) %prim(13)%bytemapspec Charno(%string(*)%name S, %integer N) %prim(14)%string(1)%fnspec Snl %prim(15)%string(1)%fnspec Tostring(%integer N) %prim(16)%integerfnspec Sizeof(%name N) %prim(17)%integerfnspec Typeof(%name N) %prim(18)%integerfnspec Intpt(%longreal R) %prim(19)%integerfnspec Int(%longreal R) %prim(20)%integerfnspec ADDR(%name N) %prim(21)%integerfnspec Trunc(%longreal R) %prim(22)%integerfnspec Round(%longreal R) %prim(23)%routinespec Read(%name N) %prim(24)%routinespec Printstring(%string(255) S) %prim(25)%routinespec Printsymbol(%integer N) %prim(26)%routinespec Skipsymbol %prim(27)%routinespec Newline %prim(28)n print utility V1.0.0", Proc ID(Help)) %if result < 0 %then Stop(result) verbosity level = Verbosity Required(handle) %if XGetPresence("Serial", handle) # 0 %then %start pv(1, "Selecting SERIAL printer") %else %if XGetPresenc Select Output %alias "IMP_SELECT_OUTPUT"(%integer N) %externalroutinespec Prompt %alias "IMP_PROMPT"(%string(15) S) %externalroutinespec OpenInput %alias "IMP_OPEN_INPUT"(%integer S,%string(63)F) %externalroutinespec OpenOutput %alias "IMP_OPEN_OUTPUT"(%ie, "Output", 1, handle) %for j = string length, -1, 1 %cycle charno(file, j) = charno(file, j-1) %repeat length(file) = string length Open Binary Output(1, file) %routine vdu(%byte ch) %if ch=255 %start i = XOsByte(Y, C, 6, 0, 0) *movb_ch, ( %integer S, %string(63) F ) %externalintegerfnspec In Stream %alias "IMP_IN_STREAM" %externalintegerfnspec Out Stream %alias "IMP_OUT_STREAM" %externalintegerfnspec Input Stream %alias "IMP_IN_STREAM" %externalintegerfnspec Output Stream %alias "IMP_OUT_STREAM" %externalroutinespec Reset Input %alias "IMP_RESET_INPUT" %externalroutinespec Close Input %alias "IMP_CLOSE_INPUT" %externalroutinespec Close Output %alias "IMP_CLOSE_OUTPUT" %externalpredicatespec EndOfInput %alias "IMP_END_OF_INPUT" %recordformat Eventfm(%integer Event, Sub, Extra, Ra, Fp, Mod, %string(127) Message) %externalrecord(Eventfm)%spec Event %alias "IMP_EVENT" %constrecord(*)%name Nil == 0 %externalrecord(*)%mapspec New %alias "IMP_NEW"(%name N) %externalroutinespec Dispose %alias "IMP_DISPOSE" ( %name N ) %external %string(255) %fn %spec Sub String %alias "IMP_SUB_STRING" ( - %string(255) S, %integer F,T) %external %string(255) %fn %spec In File Name %alias "IMP_IN_FILE_NAME" %external %string(255) %fn %spec Out File Name %alias "IMP_OUT_FILE_NAME" %external %integer %fn %spec Out Type %alias "IMP_OUT_TYPE" %external %string(9) %fn %spec Date %alias "IMP_DATE" %external %stritring(%integer N) %prim(16)%integerfnspec Sizeof(%name N) %prim(17)%integerfnspec Typeof(%name N) %prim(18)%integerfnspec Intpt(%longreal R) %prim(19)%integerfnspec Int(%longreal R) %prim(20)%integerfnspec ADDR(%name N) %prim(21)%integerfnspec Trunc(%longreal R) %prim(22)%integerfnspec Round(%longreal R) %prim(23)%routinespec Read(%name N) %prim(24)%routinespec Printstring(%string(255) S) %prim(25)%routinespec Printsymbol(%integer N) %prim(26)%routinespec Skipsymbol %prim(27)%routinespec Newline %prim(28)utine %spec Print Fl %alias "IMP_PRINT_FL" - ( %longreal R, %integer P,Q ) %external %string(255) %fn %spec Ftos %alias "IMP_F_TO_S" - ( %longreal R, %integer P,Q ) %external %long %real %fn %spec Frac Pt %alias "IMP_FRAC_PT" ( %long %real X ) %external %long %real %fn %spec SQRT %alias "MD_SQRT" ( %long %real X ) %endofperm %begin %external %integer %fn %spec Proc ID (%routine X) %external %routine %spec Stop(%integer res) %external %integer %fn %spec Verbosity Required(%integer Handle) %external %integer %fn %spec ArgumentInit(%c %integer %name Handle, %string(255) keyString, %integer Input wanted, Output wanted, %string(255) Identification, %integer Help proc) %external %integer %fn %spec XGetPresence(%c %string(255) key, %integer Handle) %external %integer %fn %spec XGetCardinalArg(%c %string(255) key, %integer Index, %integer Handle) %external %integer %fn %spec XGetStringArg(%c %string(*) %name argument, %string(255) Key, %integer Index, handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer hOF_INPUT" %recordformat Eventfm(%integer Event, Sub, Extra, Ra, Fp, Mod, %string(127) Message) %externalrecord(Eventfm)%spec Event %alias "IMP_EVENT" %constrecord(*)%name Nil == 0 %externalrecord(*)%mapspec New %alias "IMP_NEW"(%name Comments") p(" -Input file1,file2,...") p(" -Output printer: by default") p(" -NLQ Letter quality") p(" -Narrow/-Wide") p(" -Width number Normally 80 (Narrowe Name %alias "IMP_IN_FILE_NAME" %external %string(255) %fn %spec Out File Name %alias "IMP_OUT_FILE_NAME" %external %integer %fn %spec Out Type %alias "IMP_OUT_TYPE" %external %string(9) %fn %spec Date %alias "IMP_DATE" %external %strifor informtion when printing banner headers.") p("") %end %routine p(%string(255) s) PrintString(s); Newline %end %routine pv(%integer minlev, %string(255) s) %if verbosity level < minlev %then %return PrintString(s); Newline %end %routine Transfer(%integer files remaining) %integer i, tot = 0, col = 0 select input(1) select output(1) %while %not end of input %cycle readsymbol(i); printsymbol(i) %if verbosity level > 2 %start tot = tot+1 %if tot=256 %then %start tot=0 select output(0); print symbol('.'); select output(1) col = col + 1; %if col=79 %then col = 0 %and newline %finish %finish %repeat %if verbosity level > 2 %start select output(0) %if col # 0 %then newline select output(1) %finish %if files remaining > 0 %start p("") p("--------------------------------------------------------------------") p("") %finish %else printsymbol(12) printsymbol(10) select output(0) select input(0) %end %routine%begin %external %integer %fn %spec Proc ID (%routine X) %external %routine %spec Stop(%integer res) %external %integer %fn %spec Verbosity Required(%integer Handle) %external %integer %fn %spec ArgumentInit(%c %integer %name Handle, %string(255) " pages} esc('P') {pica - low grade} %if XGetPresence("NoPerfSkip", handle) # 0 %then %start esc('O') %else esc('N');b(2) %finish %if width > 80 %start esc('M') esc('!');b(4) esc('S');b(1) esc('3');b(16) %else %if width , %integer Index, %integer Handle) %external %integer %fn %spec XGetStringArg(%c %string(*) %name argument, %string(255) Key, %integer Index, handle) %external %integer %fn %spec XGetNumberOfValues(%c %string(255) Key, %integer h stop(event_extra) %finish result = ArgumentInit(%c handle, "INput=FROM=FILEs/?/A/E-lis ". %c "OUTput=TO=ON=AT/1/K[printer:] ".%c "NArrowpaper=NORMal/K/P/=0 WIdepaper=CONdensed/K/P/=0 ". %c "WIDTH/1/C/K[80] ". %c Comments") p(" -Input file1,file2,...") p(" -Output printer: by default") p(" -NLQ Letter quality") p(" -Narrow/-Wide") p(" -Width number Normally 80 (Narrowty V1.0.0", Proc ID(Help)) %if result < 0 %then Stop(result) verbosity level = Verbosity Required(handle) %if XGetPresence("Serial", handle) # 0 %then %start pv(1, "Selecting SERIAL printer") %else %if XGetPresence("Network", handle) # 0 pv(1, "Selecting ECONET printer") %else %if XGetPresence("Parallel", handle) # 0 pv(1, "Selecting PARALLEL printer") %else pv(1, "Using default printer (from !Config)") %finish %if XGetPresence("Narrow", handle) # 0 %then %sfer(%integer files remaining) %integer i, tot = 0, col = 0 select input(1) select output(1) %while %not end of input %cycle readsymbol(i); printsymbol(i) %if verbosity level > 2 %start tot = tot+1 %if tot=256 %then %start le) pv(1, "Using ".itos(width,0)." characters per line") %else pv(1, "Normal width listing - 80 chars per line") width = 80 %finish %if XGetPresence("Header", handle) # 0 %then %start string length = XGetStringArg(header, "Header", 1,ect output(1) %finish %if files remaining > 0 %start p("") p("--------------------------------------------------------------------") p("") %finish %else printsymbol(12) printsymbol(10) select output(0) select input(0) %end %routine, "Output", 1, handle) %for j = string length, -1, 1 %cycle charno(file, j) = charno(file, j-1) %repeat length(file) = string length Open Output(1, file); select output(0) initialise printer count = XGetNumberOfValues("Input", handle) %if" pages} esc('P') {pica - low grade} %if XGetPresence("NoPerfSkip", handle) # 0 %then %start esc('O') %else esc('N');b(2) %finish %if width > 80 %start esc('M') esc('!');b(4) esc('S');b(1) esc('3');b(16) %else %if width j = string length, -1, 1 %cycle charno(file, j) = charno(file, j-1) %repeat length(file) = string length pv(1, "Printing ".file) open input(1, file); select input(0) Transfer(count-i) %repeat select output(1); close output %endofprogram %external %integer %fn Proc ID(%integer a, b) %result = b %end %endoffile PbE2 (SIA1:[IMPRTL.PANOS.SOURCE.IO]IOLIB.IMP;1 1985-02-01 12:13:14(SIA1:[IMPRTL.PANOS.SOURCE.IO]IOLIB.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_CONSOLE LATTICE_INITIALISE_HANDLERS IMP_EXISTS IMP_END_OF_INPUT IMP_SELECT_INPUT IMP_SELECT_OUTPUT IMP_UPPER_CASE IMP_TO_UPPER IMP_LOWER_CASE IMP_TO_LOWER IMP_OPEN_INPUT IMP_OPEN_STORE_IN IMP_OPEN_OUTPUT IMP_OPEN_BINARY_OUTPUT IMP_OPEN_STORE_OUT LKPUT LKGET IMP_BLOCK_READ IMP_BLOCK_WRITE IMP_BREAK_OUTPUT IMP_PRINT_STRING IMP_NEW_LINE И IMP_CHARS о IMP_SPACE IMP_DELETE_FILE IMP_CLOSE_INPUT IMP_ABANDON_INPUT IMP_CLOSE_OUTPUT IMP_ABANDON_OUTPUT IMP_IN_FILE_NAME IMP_OUT_FILE_NAME IMP_IN_STREle) pv(1, "Using ".itos(width,0)." characters per line") %else pv(1, "Normal width listing - 80 chars per line") width = 80 %finish %if XGetPresence("Header", handle) # 0 %then %start string length = XGetStringArg(header, "Header", 1, PROMPTTEXT IMP_CONDITION_HANDLER IMP_X_TO_S XBLOCKWRITE SBLOCKWRITE BLOCKREAD XWRITEBYTE FINDINPUT FINDOUTPUT CLOSESTREAM IMP_I_TO_S XSELECTINPUT XSELECTOUTPUT IMP_NEW IMP_DISPOSE IMP_SELECT_INPUT IMP_SELECT_OUTPUT XDELETEFILE IMP_CLOSE_INPUT IMP_OUT_FILE_NAME IMP_CLOSE_OUTPUT SETFILEOFFSET IMP_OPEN_INPUT XBYTESOUTSTANDING LATTICE_INITIALISE_HANDLERS IMP_OPEN_OUTPUT IMP_CONSOLE IMP_SIGNAL IMP_EVENT IMP_CUR_IN IMP_CURR_OUT яяяя яяяя §Аї° ]Аї¬зБї°О End of file reached 16_ зЕa" gАaО Data: j Чu фЧС0З{ µОШХ ґЧХ(зХ р0> ѕµWР %external %integer %fn Proc ID(%integer a, b) %result = b %end %endoffile gА]О А|'Ё ОШЕї ѕь|Ј 'ѕxк пДx|Ј Illegal IMP stream number :_ёЧЕ з­?зЕA" gАAО IMP_SELECT_OUTPUT IMP_UPPER_CASE IMP_TO_UPPER IMP_LOWER_CASE IMP_TO_LOWER IMP_OPEN_INPUT IMP_OPEN_STORE_IN IMP_OPEN_OUTPUT IMP_OPEN_BINARY_OUTPUT IMP_OPEN_STORE_OUT LKPUT LKGET IMP_BLOCK_READ IMP_BLOCK_W7 \Аѕш_0 6|к1 АѕшОXАѕш ЗБxѕш gАѕщО 6|к% _ОXp RОXp _ОXp k!GЎ А|z) _єз­ §p(WА А|j*ЧЕ|" v$t_єз­ ЧЕt" _Аѕґ'Ё §АѕёgАѕґ зЕѕґз­ @зЕї ѕW_єз­ L_ё" ѕ°'Ё Аѕ°gАѕґ WАѕ°WтТ4 _єз­ L_ё" А|_W _Аѕґ'Ё §АѕёgАѕґ »xзЕѕґз­ ¦ ѕј_єз­ L_ё" ѕ°'Ё Аѕ°gАѕґ WАѕ°WтТ IMP_EVENT IMP_CUR_IN IMP_CURR_OUT яяяя яяяя §Аї° яяяя z,Яёз­ їЄ_№з­ їўЯєЯ» Яєз­ _№_№ фЧС0З{ µОШХ ґЧХ(зХ р0> ѕµWР ОXа~ ¤ЧБ|ЗБx ЧС0ФЈ Zкїт @ЧС0ФЈ ОШЕї ЧС,О єВЧС,WС gА]О А|'Ё ОШЕї ѕь|Ј 'ѕxк пДx|Ј Illegal IMP stream number :_ёЧЕ з­?зЕA" gАAО А|j)ЧЕ ЧЕ|" ЧЕ|" @§А@g ОШЕ@зЕAЧХ " ЧЕ|" ґgА@О Control: Error: _»зЭ Input: _»зЭ Output: OЯ»зЭ &|ОШЭ ыЧЕ|" &|Ч%" $'ѕ|к XпД| *** Failed to wind down input: : 16_ зЕ]" \'БѕЭgШ gА]О ОШЕѕЬЧ%" С,ОШ`!ЕР ЧЕ|" 'ѕ|к GпД| $ *** Failed to wind down output: V'БѕэgШ ОШЕѕьЧ%" (SIA1:[IMPRTL.PANOS.SOURCE.IO]IOLIB.IMP;1 PbE2 0SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]PANDIAG.IMP;1 1985-02-01 12:13:140SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]PANDIAG.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 LATTICE_DIAGNOSE ERRORFILE IMP_CONDITION_HANDLER IMP_PRINT_STRING IMP_WRITE IMP_PRINT_HEX IMP_F_TO_S IMP_CHARS STOP IMP_SELECT_OUTPUT IMP_CLOSE_OUTPUT IMP_OPEN_OUTPUT IMP_SIGNAL IMP_EVENT IMP_CURR_OUT яяяя яяяя ERROR: >ѕьк4 >ѕьО '®?ѕшWАѕш ЧБѕьЗБѕф \АѕА_Аѕј'Ж@ѕґО Ж@ѕ° Аѕ°Ъ АѕґЧБѕґО АѕАО ЗЖѕёѕАкї№ЯАѕј АѕАО §Д?ѕАкї gАѕБО not assigned invalid ordinal value ЯёЧЕ З|ЧА ГАx'^ кї¶_ё язЕѕщ ѕшзЕѕш" ЧХ|/Ф|О False True Vїј| ОXPѕ §Q^ѕ З|кїж Fз­ з­ Р|гUH" Р|зU`" Р|зUѕ Р|ЯPїґ ГgЁ' Chr( _ёЧЕ _DЧС '®.D А`ОXБ` ЗЕD`_ёЧБ язЕЅ ЖЅ|| \_АїґЧБ ГБH'~ ЖT@C Ж@ї° @§А@g ОШЕ@зЕAЧХ " ЧЕ|" ґgА@О Control: Error: _»зЭ Input А@зШ H}пP UкѕV ??? кqЧБP not assigned кV_ёЧЕP" ¦яяя =" \'БѕЭgШ gА]О ОШЕѕЬЧ%" С,ОШ`!ЕР ЧЕ|" 'ѕ|к GпД| $ *** Failed to wind down output: V'БѕэgШ ОШЕѕьЧ%" unprintable real value Я»ЯёWАP>ЫM язЕЅ ОXАї §Бeї ѕД§© unprintable real value кѕvз­ БPѕДu язЕЅ g.PANOS.SOURCE.IO]IOLIB.IMP;1 PbE2 0SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]PANDIAG.IMP;1 1985-02-01 12:13:140SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]PANDIAG.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 LATTICE_DIAGNOSE ERRORFILE IMP_CONDITION_HAАP АїјЪ(§ ngЁ( _»ЧЕP" (disposed) Жї°@кјЄ§ 6HОYq hкјоЯЗїЁ_Аї¬gЁ АїЁ4¦ ЬЯАї¬ Бї°К _ёЧЕїЁ" яяяя яяяя ERROR: >ѕьк4 >ѕьО '®?ѕшWАѕш ЧБѕьЗБѕф \АѕА_Аѕј'Ж@ѕґО Ж@ѕ° Аѕ°Ъ АѕґЧБѕґО Бѕf. YWБxGЎ Event ЯёЧµ 6ЯёЧµ (ЯёЧµ Overflow язЕѕщ ѕшзЕѕш" ЧХ|/Ф|О False True Vїј| ОXPѕ §Q^ѕ З|кїж Fз­ з­ Р|гUH" Р|зU`" Р|зUѕ Р|ЯPїґ Time exceeded Data error Symbol value _ёЧЕt" in data Corrupt data Data transmission error Invalid arguments For loop cannot terminate Illegal exponent ЯёЧЕt" Array inside-out String inside-out Illegal parameter Out of range Array index ( _ёЧЕt" ) not in bounds Switch index ( Illegal event ЯёЧЕt" Charno _ёЧЕt" does not exist ЧЯёЧЕt" is not a character value Resolution fails Undefined value Unassigned variable Switch label ( Corrupt control variable I/O error Input ended Illegal stream ЯёЧЕt" NIL pointer used Reference to DISPOSED object ('Zero or negative argument for logarithm Significance lost x MOD _ёЧЕt" is not permitted Missing case "!Negative argument for square root Disposing NIL poinАP АїјЪ(§ ngЁ( _»ЧЕP" (disposed) Жї°@кјЄ§ 6HОYq hкјоЯЗїЁ_Аї¬gЁ АїЁ4¦ ЬЯАї¬ Бї°К _ёЧЕїЁ" кЅ"gЁ Diagnostics being sent to ЄЯё" " јсз­ Executing tОYX КїтО CБPCБt YWБxGЎ Event ЯёЧµ 6ЯёЧµ (ЯёЧµ Overflow called from line ЯёЧЕl" in Б\ОШu язЕѕЅ ѕјзЕѕј" starting at line ЯёЧЕp" зЕїј" module язЕѕЅ Time exceeded Data error Symbol value _ёЧЕt" in data Corrupt data 0SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]PANDIAG.IMP;1 PbE2 0SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]MINDIAG.IMP;1 1985-02-01 12:13:140SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]MINDIAG.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_DIAGNOSE IMP_CONDITION_HANDLER 0SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]MINDIAG.IMP;1 PbE2 /SIA1:[IMP" does not exist ЧЯёЧЕt" is not a character value Resolution fails Undefined value Unassigned variable Switch label ( CorrLISE_IO LATTICE_TERMINATE_IO IMP_X_TO_S LATTICE_DIAGNOSE IMP_EVENT ----> Initialise ----> Sgument for logarithm Significance lost x MOD _ёЧЕt" is not permitted Missing case "!Negative argument for square root Disposing NIL poinэ'Ё gАmО ----> Exception passed on зЕm" lзБѕнgШ gАmО ОШЕѕмЧ=" ----> Diagnose Ѕ"gЁ Diagnostics being sent to ЄЯё" " јсз­ Executing tОYX КїтО CБPCБt known handler type $ОYx Чx|4  ОЭx~О\x кK4  Чx|4  ОЭx~О\x /SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]LLHAND.IMP;1 PbE2 .SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]CONNECT.IMP;1 1985-02-01 12:13:14.SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]CONNECT.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_DISCONNECT_FILE CONNECTFILE IMP_CONDITION_HANDLER IMP_OPEN_INPUT IMP_SELECT_INPUT IMP_IN_SIZE IMP_CLOSE_INPUT IMP_GET_SPACE IMP_NEW 7ЧБ| _ _( ЧБ|Я ОШЕї я§Аї ОШАї SE]MINDIAG.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_DIAGNOSE IMP_CONDITION_HANDLER 0SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]MINDIAG.IMP;1 PbE2 /SIA1:[IMPMPRTL.PANOS.SOURCE.DIAGNOSE]SIGNAL.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_SIGNAL IMP_EVENT IMP_CONDITION_HANDLER SIGNAL IMP_CONSOLE LISE_IO LATTICE_TERMINATE_IO IMP_X_TO_S LATTICE_DIAGNOSE IMP_EVENT ----> Initialise ----> Stice Logic IMP 9.12-2.27-2.4 B IMP_CLEAR IMP_GET_SPACE IMP_FREE_SPACE IMP_HEAP_STRING IMP_NEW IMP_DISPOSE IMP_CONDITION_HANDLER ALLOCATE IMP_GET_SPACE IMP_FREE_SPACE IMP_SIGNAL IMP_EVENT Heap failure -- ОП9]'~ x_Аt'Ц АpЪ7 Жptz ЖptWБhWГp Жlhкїј#ЖphкїµWБx xкї  Бd_` Ч%зЕx" Cannot extend heap Heap Corrupt 3 ОПБ| Heap Corrupt 4 А|ЈА АpЧQ >tЧБtNгГ АpЧQ pкїeЯ ѕ·ЧЕ Extend heap logic error Nг{|| L.PANOS.SOURCE.SYSTEM]CONNECT.IMP;1 1985-02-01 12:13:14.SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]CONNECT.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_DISCONNECT_FILE CONNECTFILE IMP_CONDITION_HANDLER IMP_OPEN_INPUT IMP_SELECT_INPUT IMP_IN_SIZE IMP_CLOSE_INPUT IMP_GET_SPACE IMP_NEW 7ЧБ| _ _( ЧБ|Я ОШЕї я§Аї ОШАї 985-02-01 12:13:14+SIA1:[IMPRTL.PANOS.SOURCE.CORE]REALIO.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_F_TO_S IMP_R_TO_S и IMP_PRINT IMP_PRINT_FL IMP_CONDITION_HANDLER IMP_I_TO_S IMP_R_TO_S IMP_PRINT_STRING IMP_F_TO_S xЯАtѕ4Ж ѕ ¦@$ Зtкj> ѕ ¦@$ Аtкj \Аѕа _А > x_Аlк xѕДЕx їx'F lЧЕl Бxѕ°Ў@$ ѕ ЖpxNгЕ ѕ0 ?а Еx@$ ѕ ¦@$ \Аѕа> ѕа>;Жxd Аѕа§ d0ОXБѕа 7ЕѕаО z0зАЅбgАѕб§X §АѕаgАЅаО АѕаО §В.ѕа !ѕ°Ў@$ 6x>;6d Аѕаg АѕакH АѕаОXБѕа §Е@ѕа АѕаОШАѕа §Г-ѕак АѕаО §В+ѕа_ёNуЕlз­?зЕЅб" Ѕа§А`gАЅаО АѕаО §В0ѕа АѕаОXАѕа §Б0ѕа'БѕбО gАaО X\Аї _А > ѕшNгЕ Ѕ@ѕ0 ?а Бѕшz АѕфЪ >;Жѕшѕи_ёЧЕѕиз­?зЕѕ©" ѕЁ'Бї gАѕ©О z0'БЅ©gАї gАЅЁО §В.ї Аѕиѕ Бѕшѕ ѕ°Ў@$ 6ѕш>;6ѕи ѕи0О Жlhкїј#ЖphкїµWБx xкї  Бd_` Ч%зЕx" Cannot extend heap Heap Corrupt 3 |CE.CORE]REALIO.IMP;1 PbE2 /SIA1:[IMPRTL.PANOS.SOURCE.PASCAL]PASCALIO.IMP;2 1985-02-01 12:13:14/SIA1:[IMPRTL.PANOS.SOURCE.PASCAL]PASCALIO.IMP;2 Lattice Logic IMP 9.12-2.27-2.4 PASCAL_INIT PASCAL_RESET PASCAL_REWRITE PASCAL_RESET_FIxtend heap logic error Nг{|| PASCAL_READR PASCAL_GET PASCAL_PUT PASCAL_WRITE PASCAL_PAGE P_JOUT PASCAL_CLOSE PASCAL_EOJ IMP_CONDITION_HANDLER IMP_I_TO_S IMP_GET_SPACE IMP_SELECT_INPUT IMP_CLOSE_INPUT IMP_SELECT_OUTPUT IMP_BREAK_OUTPUT IMP_CLOSE_OUTPUT IMP_CLEAR IMP_OPEN_INPUT IMP_OPEN_INPUT IMP_OPEN_OUTPUT IMP_OPEN_OUTPUT IMP_DELETE_FILE IMP_FREE_SPACE IMP_PROMPT ARGUMENTS DECODEINIT GETSTRINGARG PASCAL_RESET PASCAL_REWRITE IMP_IN_STREAM PASCAL_SELIN PASCAL_SAFETY PASCAL_READI IMP_PRINT_STRING IMP_CHARS IMP_R_TO_S IMP_F_TO_S ! IMP_SIGNAL IMP_EVENT IMP_CUR_IN ERRORFILE " IMP_CURR_OUT No free input streams No free ѕ ѕ ЖpxNгЕ ѕ0 ?а Еx@$ ѕ ¦@$ \Аѕа> ѕа>;Жxd Аѕа§ d0ОXБѕа 7ЕѕаО z0зАЅбgАѕб§X §АѕаgАЅаО АѕаО §В.ѕа !ѕ°Ў@$ 6x>;6d 8зБї±gАїq§x X_А| (кmз WС(\h OзЕї© gАїЁО WС(WУ$ С(Яg dWС(WГ Бѕшz АѕфЪ >;Жѕшѕи_ёЧЕѕиз­?зЕѕ©" ѕЁ'Бї gАѕ©О z0'БЅ©gАї gАЅЁО §В.ї Аѕиѕ Бѕшѕ ѕ°Ў@$ 6ѕш>;6ѕи ѕи0О %ОШm WС(ОШm WС(Ьh RОШm WС(\h WС(T WС(Ьh bWС(Ьh Corrupt expiry addresses ј­_А| GWС( зmCE.CORE]REALIO.IMP;1 PbE2 /SIA1:[IMPRTL.PANOS.SOURCE.PASCAL]PASCALIO.IMP;2 1985-02-01 12:13:14/SIA1:[IMPRTL.PANOS.SOURCE.PASCAL]PASCALIO.IMP;2 Lattice Logic IMP 9.12-2.27-2.4 PASCAL_INIT PASCAL_RESET PASCAL_REWRITE PASCAL_RESET_FI їXWС( їFк3WС( Ц,tW° _Р0'Ё §Р4gР0 ьЬР>ЬР -Terminal -Terminal ©_ё_ё" D'ѕїјк sпДїј§А@g -- .gБѕЅgШ gАAО §А@gАѕјО Reset on non-existent file RgБѕЅgШ gАAО ОШЕѕјЧ- єЈЧЕ »єЧЕ јhWС( їzЯёЧЕ 'ѕ|к/пД| IMP_BREAK_OUTPUT IMP_CLOSE_OUTPUT IMP_CLEAR IMP_OPEN_INPUT IMP_OPEN_INPUT IMP_OPEN_OUTPUT IMP_OPEN_OUTPUT IMP_DELETE_FILE IMP_FREE_SPACE IMP_PROMPT ARGUMENTS DECODEINIT GETSTRINGARG PASCAL_RESET PASC ЯёЧЕ _№ЧЕ є`ЧР(ЬX INPUT ОЕЖї OUTPUT #ОДЖї No free input streams No free A/K ЯєзЭ Ѕдкїё ERROR/K[ERROR:] язЕјЭ" јЬОШЕјЬзЕјЭЧЕЅьз зЕЅи" ('internal error while decoding arguments з­'зЭ Ц$Ѕд Ы§Аѕ ЧЕЅиЯёОШЕѕ зЕЅрз­ язЕї ЖЅрї 8зБї±gАїq§x X_А| (кmз WС(\h OзЕї© gАїЁО WС(WУ$ С(Яg dWС(WГ TГязµ ЖјШ| N#^|| ЧЕ|" N#V|| ЧЕ|" N#N||CА|Ч ЧЕ|" N#V|| ||ЧЕ ЧЕ|" (WР( "!RESET required before read access з­!зЭ µ1ОШM (WР( %$REWRITE required before write access з­$зЭ ґшОШM $REW ё0ЧЕt" EOLN invalid at EOF WР(О ·ёWР( їЬкїф Р,ОX@ illegal number syntax _А|_Аx 'FPt Еxу334j ОЈАxЈ ї7кї» N#Жxx ЧХ|/Ф| ыяяя h_А@ Р|ОcрBї ЗBxї $ЧР| X\_АlWX`§H hWР|ЧрJї dОу  АdО7  WdWАlОs  ЧАlОч  lкїЛЧР| _\_ё кїр> ЯёЧЕ _№ЧЕ є`ЧР(ЬX INPUT ОЕЖї OUTPUT #ОДЖї '~PH ЖX\ЧЕH -ЯАP ѕcкї jѕ0Аh Жїt| |ЧС( xЧБ|ОXx їнЧС(Ч} p_Аt_Аp_Аl К;_ёЧЕ з­?зЕA" "! is not an acceptable field width 0зБѕБgАA ОШЕѕАЧ= |ЧБ| |WБhО АXзШ Ґ}пP Corrupt I/O program Б|Чu В|кїё Б|Чu В|кї¦ WБhО WБhО WБhО uNгЕtWБ|Чm з­?зЕѕ В|WС,TЈ кїMз­ з WБ|Wh В|ЧС,ФЈ кї.ЧБ|ѕ _АtЧЕpNгЕtѕДЕPз­ язЕЅ WС,TЈ кѕиWБ|ѕ ЯАtЧЕtЯёѕДЕPз­ язЕЅ §АѕРgАЅ §ДeѕМзЕѕР" ЧР,Фў TrueFalse d_Вlк dЯВl'^ Жltz Жtlз­ ЧЕtгЕl" WАdОXH ЗlкїлЧС,ФЈ кѕ,gЁ ЧС,ФЈ №xкѕ ЧБ|Ч} В|кѕ АhкЅш пЧС,ФЈ >|ЧЕ|зЕ| ± ЧБ| |ЧЕ|ЧЕx яяя_ё °Ш_ё" Я "! Я "!ОЈ0Ј(Ч2|Оc0П їЮОЈX _ "Э µ1ОШM (WР( %$REWRITE required before write access з­$зЭ ґшОШM $REW ё0ЧЕt" IA1:[IMPRTL.PANOS.SOURCE.SYSTEM]PARAMS.IMP;1 1985-02-01 12:13:14-SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]PARAMS.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 PASCAL_PARAMS IMP_CONDITION_HANDLER ARGUMENTS IMP_CLOSE_INPUT IMP_SELECT_INPUT illegal number syntax _А|_Аx 'FPt Еxу334j ОЈАxЈ ї7кї» N#Жxx ЧХ|/Ф| ыяяя h_А@ Ѕшк*ЧС|З{ЅфЅр hЧС| yЅфОШг~ї _А|'ѕxк,пДx Cannot access ЧС|з}ї ЧС|ФЈ ї ОШ}ї ЯА|Яё" ЧС|ОШ{ї І'ѕЅмк пДЅм Хкi_єз­ D_ё" \@ з Ѕш`ЅшWБЅь ЗlЅш equals (=) required following ЧЕЅь" p ОXq ЗuЅш ЖЅи| Бї|W0§Аї Association for 'Бѕ}gШ ОШЕѕ|Ч%" з­ ї| " o_ё_ё" Бї|W0§Аї gp!О @ї|кїW_ -SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]PARAMS.IMP;1 PbE2 *SIA1:[IMPRTL.PANOS.SOURCE.CORE]MATHS.IMP;1 1985-02-01 1 В|кї¦ WБhО WБhО WБhО uNгЕtWБ|Чm з­?зЕѕ В|WС,TЈ кїMз­ з WБ|Wh В|ЧС,ФЈ кї.ЧБ|ѕ _АtЧЕpNгЕtѕДЕPз­ язЕЅ WС,TЈ кѕиWБ|ѕ ЯАtЧЕtЯёѕДЕPз­ язЕЅ §АѕРgАЅ юNЧЎ яя«Б -DTы!щ? ИЙm0_Ф? ¶ѕДЕ |_ёѕДЕ Ў?вв Ў?Ъµ5 6hѕ 0ѕ `_їѕД Бpѕ Б`ѕ XѕЧЕ|зЕ| ± ЧБ| |ЧЕ|ЧЕx яяя_ё °Ш_ё" Я "! Я "!ОЈ0Ј(Ч2|Оc0П їЮОЈX lѕ°Ш Аlѕ Аdѕ Tѕ°Ш Яѕ°АTѕ йѕ0АTѕ Шѕ0АTѕ БTѕ° 6їјѕ Б\ѕ01ѕ &їј> Б|ѕ°Щ 6їј> Б|ѕ0Щ яяяяяяП?Яціoдp|? ЬXo¤Rс> ІQBq q¬? 8Юo ?@IA1:[IMPRTL.PANOS.SOURCE.SYSTEM]PARAMS.IMP;1 1985-02-01 12:13:14-SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]PARAMS.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 PASCAL_PARAMS IMP_CONDITION_HANDLER ARGUMENTS IMP_CLOSE_INPUT IMP_SELECT_INPUT ®вѕ @TUUUUUЕї° *їcр$Ґг З>«А]KEжZѕ0Фjh< Ь дjЅ V>#6|> Ж|\4¦ А\ѕ°Ш ­ѕґБ А\ѕ°Ш 6tѕґ1> Бtѕ°1ѕ Аѕ°0ѕ °ѕ°0ѕ  ѕ°0ѕ ѕ°0ѕ ѕ°0ѕ pѕ°0ѕ `ѕ°0ѕ Pѕ°0ѕ Аtѕ0 Жttѕ MѕД5ѕДЕ ЄLXиz¶ы?T °Рхlз?VН Q¦`+АКјв№ 4Аcj \?э АЅ ±ЩzНкї© D@¤m U@ЦЈр Хкi_єз­ D_ё" \@ з Ѕш`ЅшWБЅь ЗlЅш equals (=) required following ЧЕЅь" ЖxxWБlзщЭ Жxxѕ *SIA1:[IMPRTL.PANOS.SOURCE.CORE]MATHS.IMP;1 PbE2 *SIA1:[IMPRTL.PANOS.SOURCE.CORE]READI.IMP;1 1985-0 @ї|кїW_ -SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]PARAMS.IMP;1 PbE2 *SIA1:[IMPRTL.PANOS.SOURCE.CORE]MATHS.IMP;1 1985-02-01 1 pSlW° ¦у334|з© ОгБ|гЎ >x_АtW° §N#ЖthЧЎ ОуБh >|ОгБhгЎ >x_Аt_Аdк J ' pP`к&§© _«Бp§qїї _kБp'nI`к Ж`hЪ Жt|j Жt|К Ж`xz XWБtОcБhcБ` .tЯАdW юNЧЎ яя«Б -DTы!щ? ИЙm0_Ф? ¶ѕДЕ |_ёѕДЕ Ў?вв Ў?Ъµ5 6hѕ 0ѕ `_їѕД Бpѕ Б`ѕ XѕTL.PANOS.SOURCE.CORE]READS.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_READ_S IMP_CONDITION_HANDLER IMP_SIGNAL IMP_CUR_IN кPОШБї ОXБї ЗЕѕьї jїІ *SIA1:[IMPRTL.PANOS.SOURCE.CORE]READS.IMP;1 PbE2 *SIA1:[IMPRTL.PANOS.SOURCE.CORE]READR.IMP;1 1985-02-01 12:13:14*SIA1:[IMPRTL.PANOS.SOURCE.CORE]READR.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_READ_R IMP_CONDITION_HANDLER IMP_READ_I IMP_SIGNAL IMP_CUR_IN ЧХ|/Ф| ыяяя >|к) >|WС| ОЈiX 6x'© Зoxї $ЧС| x\_АlWy`§i 6hк, 6hWС|Чсnї >dОуiX БdО7iXN wdWБlОsqX ЧАlОчpXNЧ  lкѕ°0ѕ pѕ°0ѕ `ѕ°0ѕ Pѕ°0ѕ Аtѕ0 Жttѕ MѕД5ѕДЕ ЄLXиz¶ы?T °Рхlз?VН Q¦`+АКјв№ 4Аcj \?э АЅ ±ЩzНкї© D@¤m U@ЦЈЕH ¶ЯЗTк X_А`ЯАd_АT_А\к J ' HPDк&з© _лБHзyїї _kБH'nIDк ЖDXЪ! ЖT\ЧЕD 9ЯАLW° iѕ0Аh Жїt| ЖxxWБlзщЭ Жxxѕ *SIA1:[IMPRTL.PANOS.SOURCE.CORE]MATHS.IMP;1 PbE2 *SIA1:[IMPRTL.PANOS.SOURCE.CORE]READI.IMP;1 1985-0AGNOSE]STACKCH.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 LL_STACK_CHECK LL_MINIMUM_FREE IMP_CONDITION_HANDLER IMP_SIGNAL CURRENTHEAPEND зБ|г± 0SIA1:[IMPRTL.PANOS.SOURCE.DIAGNOSE]STACKCH.IMP;1 PbE2 +SIA1:[IMPRTL.PANOS.SOURCE.CORE]SUBSTR.IMP;1 1985-02-01 12:13:14+SIA1:[IMPRTL.PANOS.SOURCE.CORE]SUBSTR.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_SUB_STRING IMP_CONDITION_HANDLER IMP_SIGNAL ѕьЧБ гБ GБѕьК Аѕшz АѕьЯ .gБї +SIA1:[IMPRTL.PANOS.SOURCE.CORE]SUBSTR.IMP;1 PbE2 ,SIA1:[IMPRTL.PANOS.SOURCE.DRIVERS]STOI.IMP;1 1985-02-01 12:13:14,SIA1:[IMPRTL.PANOS.SOURCE.DRIVERS]STOI.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_S_TO_I IMP_CONDITION_HANDLER IMP_SIGNAL _Аѕр'® ѕм_Аѕь_8О >ѕшк >ѕшО Аѕф_ ЯЗѕрк ЯАѕрк N#Жѕьѕм_Аѕьк ѕфPѕик+§© _«Бѕф-02-01 12:13:14*SIA1:[IMPRTL.PANOS.SOURCE.CORE]READR.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_READ_R IMP_CONDITION_HANDLER IMP_READ_I IMP_SIGNAL IMP_CUR_IN ЧХ|/Ф| ыяяя MP;1 1985-02-01 12:13:14)SIA1:[IMPRTL.PANOS.SOURCE.CORE]ITOS.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_I_TO_S Й IMP_WRITE IMP_CONDITION_HANDLER IMP_I_TO_S IMP_PRINT_STRING яяяяяяя Б'Жpx'Ю т|ЯАt_Аp _АtN#Ж ЗpЧБ §©0Ј9WБp ЗpWБp §Е-pк ЗpWБp §Е p §Е-pЯ'#Б ЗpWБp §Е pкoN#Жp ЗpWБp gаЕqО з­?зЕA" @зЕ@" )SIA1:[IMPRTL.PANOS.SOURCE.CORE]ITOS.IMP;1 PbE2 )SIA1:[IMPRTL.PANOS.SOURCE.CORE]ITOX.IMP;1 1985-02-01 12:13:14)SIA1:[IMPRTL.PANOS.SOURCE.CORE]ITOX.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_X_TO_S IMP_PRINT_HEX IMP_CONDITION_HANDLER IMP_X_TO_S IMP_PRINT_STRING яяяяяяя Ё'Жlx'Ю Э|_Аl_8 z ' p7pк ЗlЧБl ЗЗplЧБtЗЎ ЗlЧБl §З l rN#Ж ЗlЧБl gаЗmО язЕї )SIA1:[IMPRTL.PANOS.SOURCE.CORE]ITOX.IMP;1 PbE2 -SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]FREEST.IMP;1 1985-02-01 12:13:14-SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]FREEST.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_FREE_STORE IMP_CONDITION_HANDLER LL___HEAP_BASE А|#° -SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]FREEST.IMP;1 PbE2 ,SIA1:[IMPRTL.PANOS.SOURCE.CORE]DAYTIME.IMP;1 1985-02-01 12:13:14,SIA1:[IMPRTL.PANOS.SOURCE.CORE]DAYTIME.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_DATE IMP_TIME SYSTEMTIME IMP_CPU_TIME IMP_CONDITION_HANDLER DATE TIME STANDARDTIME HзЕxз­?зЕї№" Жxїё gАї№О HзЕxз­?зЕї№" Жxїё gАї№О HзЕxз­?зЕї№" Жxїё 1985-01-01 00:00:00.00 §АїёgШ еЖї¶. ОXБїё gАї№О ,SIA1:[IMPRTL.PANOS.SOURCE.CORE]DAYTIME.IMP;1 PbE2 .SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]LLTRANS.IMP;1 1985-02-01 12:13:14.SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]LLTRANS.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 LL_TRANSLATE IMP_CONDITION_HANDLER GETGLOBALSTRING ОШЕї зЕЅшз­ язЕѕ ЖЅшѕ .SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]LLTRANS.IMP;1 PbE2 -SIA1:[IMPRTL.PANOS.SOURCE.MISC]UNIVDATA.IMP;3 1985-02-01 12:13:14-SIA1:[IMPRTL.PAяяяяяя Б'Жpx'Ю т|ЯАt_Аp _АtN#Ж ЗpЧБ §©0Ј9WБp ЗpWБp §Е-pк ЗpWБp §Е p §Е-pЯ'#Б ЗpWБp §Е pкoN#Жp ЗpWБp gаЕqО з­?зЕA" @зЕ@" ! simulator for 8080/8085 machine instruction set %routine simulate(%integer PC) %integer opc %switch sw(0:255) %cycle opc = bfetch(PC) %if opc&2_1100 0000 = 2_0100 0000 %start ! 01XX XXXX 64..127 MOV d, s %continue %finish %else -> sw IMP_PRINT_HEX IMP_CONDITION_HANDLER IMP_X_TO_S IMP_PRINT_STRING яяяяяяя Ё'Жlx'Ю Э|_Аl_8 z ' p7pк ЗlЧБl ЗЗplЧБtЗЎ 010): ! ADC 2 sw(2_10001011): ! ADC 3 sw(2_10001100): ! ADC 4 sw(2_10001101): ! ADC 5 sw(2_10001110): ! ADC 6 sw(2_10001111): ! ADC 7 EA == bytereg(0); -> adc sw(16_8E): ! ADC M EA == mem adc: %continue {--------------------------------- ADD --------;1 1985-02-01 12:13:14-SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]FREEST.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 IMP_FREE_STORE IMP_CONDITION_HANDLER LL___HEAP_BASE А|#° 6): ! ADD M EA == mem; -> add sw(16_C6): ! ADI EA == imm add: %continue {--------------------------------- AND ------------------------------------} sw(2_10100000): ! ANA 0 sw(2_10100001): ! ANA 1 sw(2_10100010): ! ANA 2 sw(2_10100011): ! ANA 3 sw(2_MTIME IMP_CPU_TIME IMP_CONDITION_HANDLER DATE TIME STANDARDTIME HзЕxз­?зЕї№" Жxїё gАї№О HзЕxз­?зЕї№" Жxїё gАї№О HзЕxз­?зЕї№" ----------------------} sw(16_CD): ! CALL %continue sw(16_DC): ! CC %continue sw(16_FC): ! CM %continue sw(16_D4): ! CNC %continue sw(16_C4): ! CNZ %continue sw(16_F4): ! CP %continue sw(16_EC): ! CPE %continue sw(16_E4): ! CPO %continue swL.PANOS.SOURCE.SYSTEM]LLTRANS.IMP;1 1985-02-01 12:13:14.SIA1:[IMPRTL.PANOS.SOURCE.SYSTEM]LLTRANS.IMP;1 Lattice Logic IMP 9.12-2.27-2.4 LL_TRANSLATE IMP_CONDITION_HANDLER GETGLOBALSTRING ---------------- CMP ------------------------------------} sw(2_10111000): ! CMP 0 %continue sw(2_10111001): ! CMP 1 %continue sw(2_10111010): ! CMP 2 %continue sw(2_10111011): ! CMP 3 %continue sw(2_10111100): ! CMP 4 %continue sw(2_10111101): ! CMP 5 %continue sw(2_10111110): ! CMP 6 %continue sw(2_10111111): ! CMP 7 %continue sw(16_BE): ! CMP M %continue sw(16_FE): ! CPI %continue {--------------------------------- DAA ------------------------------------} sw(16_27): ! DAA %continue! simulator for 8080/8085 machine instruction set %routine simulate(%integer PC) %integer opc %switch sw(0:255) %cycle opc = bfetch(PC) %if opc&2_1100 0000 = 2_0100 0000 %start ! 01XX XXXX 64..127 MOV d, s %continue %finish %else -> sw DEC ------------------------------------} sw(2_00000101): ! DCR 0 %continue sw(2_00001101): ! DCR 1 %continue sw(2_00010101): ! DCR 2 %continue sw(2_00011101): ! DCR 3 %continue sw(2_00100101): ! DCR 4 %continue sw(2_00101101): ! DCR 5 %contin010): ! ADC 2 sw(2_10001011): ! ADC 3 sw(2_10001100): ! ADC 4 sw(2_10001101): ! ADC 5 sw(2_10001110): ! ADC 6 sw(2_10001111): ! ADC 7 EA == bytereg(0); -> adc sw(16_8E): ! ADC M EA == mem adc: %continue {--------------------------------- ADD ------------------------------------ DI ------------------------------------} sw(16_F3): ! DI %continue sw(16_FB): ! EI %continue {--------------------------------- ------------------------------------} sw(16_76): ! HLT %continue {--------------------------------- IN ------------------------------------} sw(16_DB): ! IN %continue sw(16_D3): ! OUT %continue {--------------------------------- INC ------------------------------------} sw(2_00000100): ! INR 0 %continue sw(2_00001100): ! INR 1 %continue sw(2_00010100): ! INR 2 %continue sw(2_00011100): ! INR 3 %continue sw(2_00100100): ! INR 4 %continue sw(2_00101100): ! INR 5 %continue sw(2_00110100): ! INR 6 %continue sw(2_00111100): ! INR 7 %continue sw(16_34): ! INR M %continue sw(2_00000011): ! INX 0 %continue sw(2_00010011): ! INX 1 %continue sw(2_00100011): ! INX 2 %continue sw(2_00110011): ! INX 3 %continue {--------------------------------- JMP ------------------------------------} sw(16_DA): ! JC %continue sw(16_FA): ! JM %continue sw(16_C3): ! JMP %continue sw(16_D2): ! JNC %continue sw(16_C2): ! JNZ %continue sw(16_F2): ! JP %continue sw(16_EA): ! JPE %continue sw(16_E2): ! JPO %continue sw(16_CA): ! JZ %continue sw(16_E9): ! PCHL %continue {------------------------- CMP ------------------------------------} sw(2_10111000): ! CMP 0 %continue sw(2_10111001): ! CMP 1 %continue sw(2_10111010): ! CMP 2 %continue sw(2_10111011): ! CMP 3 %continue sw(2_10111100): ! CMP 4 %continue sw(2_10111101): ! CMP 5 %continue sw(2_10111110): ! CMP 6 %continue sw(2_10111111): ! CMP 7 %continue sw(16_BE): ! CMP M %continue sw(16_FE): ! CPI %continue {--------------------------------- DAA ------------------------------------} sw(16_27): ! DAA %continue): ! MOV M, 4 %continue sw(2_01110101): ! MOV M, 5 %continue sw(2_01110110): ! MOV M, 6 %continue sw(2_01110111): ! MOV M, 7 %continue sw(2_00000110): ! MVI 0 %continue sw(2_00001110): ! MVI 1 %continue sw(2_00010110): ! MVI 2 %continue sw(2_00011110): ! MVI 3 %continue sw(2_00100110): ! MVI 4 %continue sw(2_00101110): ! MVI 5 %continue sw(2_00110110): ! MVI 6 %continue sw(2_00111110): ! MVI 7 %continue sw(16_36): ! MVI %continue sw(16_32): ! STA %continue sw(2_00000010): ! STAX 0 %continue sw(2_00010010): ! STAX 1 %continue {--------------------------------- NOP ------------------------------------} {--------------------------------- ------------------------------------} sw(0): ! NOP %continue {--------------------------------- OR ------------------------------------} sw(2_10110000): ! ORA 0 %continue sw(2_10110001): ! ORA 1 %continue sw(2_10110010): ! ORA 2 %continue sw(2_10110011): ! ORA 3 %continue sw(2_10110100): ! ORA 4 %continue sw(2_10110101): ! ORA 5 %continue sw(2_10110110): ! ORA 6 %continue sw(2_10110111): ! ORA 7 %continue sw(16_B6): ! ORA M %continue sw(16_F6): ! ORI %continue {--------------------------------- POP ------------------------------------} sw(2_11000001): ! POP 0 %continue sw(2_00010100): ! INR 2 %continue sw(2_00011100): ! INR 3 %continue sw(2_00100100): ! INR 4 %continue sw(2_00101100): ! INR 5 %continue sw(2_00110100): ! INR 6 %continue sw(2_00111100): ! INR 7 %continue sw(16_34): ! INR M %continue sw(2_0--------------------------------- ROT ------------------------------------} sw(16_17): ! RAL %continue sw(16_1F): ! RAR %continue sw(16_0F): ! RRC %continue sw(16_07): ! RLC %continue {--------------------------------- RET -------------------------JM %continue sw(16_C3): ! JMP %continue sw(16_D2): ! JNC %continue sw(16_C2): ! JNZ %continue sw(16_F2): ! JP %continue sw(16_EA): ! JPE %continue sw(16_E2): ! JPO %continue sw(16_CA): ! JZ %continue sw(16_E9): ! PCHL %continue {---------Z %continue {--------------------------------- RIM ------------------------------------} sw(16_20): ! RIM %continue sw(16_30): ! SIM %continue {--------------------------------- RST ------------------------------------} sw(2_11000111): ! RST 0 scaled ? %continue sw(2_11001111): ! RST 1 %continue sw(2_11010111): ! RST 2 %continue sw(2_11011111): ! RST 3 %continue sw(2_11100111): ! RST 4 %continue sw(2_11101111): ! RST 5 %continue sw(2_11110111): ! RST 6 %continue sw(2_11111111): ! RST 7 %continue {--------------------------------- SBB ------------------------------------} sw(2_10011000): ! SBB 0 %continue sw(2_10011001): ! SBB 1 %continue sw(2_10011010): ! SBB 2 %continue sw(2_10011011): ! SBB 3 %continue sw(2_10011100): ! SBB 4 %continue sw(2_10011101): ! SBB 5 %continue sw(2_10011110): ! SBB 6 %continue sw(2_10011111): ! SBB 7 %continue sw(16_9E): ! SBB M %continue sw(16_DE): ! SBI %continue {--------------------------------- SHLD -----------------------------------0 %continue sw(2_00010010): ! STAX 1 %continue {--------------------------------- NOP ------------------------------------} {--------------------------------- ------------------------------------} sw(0): ! NOP %continue {------------------------------------------------ SUB ------------------------------------} sw(2_10010000): ! SUB 0 %continue sw(2_10010001): ! SUB 1 %continue sw(2_10010010): ! SUB 2 %continue sw(2_10010011): ! SUB 3 %continue sw(2_10010100): ! SUB 4 %continue sw(2_10010%continue sw(2_10110110): ! ORA 6 %continue sw(2_10110111): ! ORA 7 %continue sw(16_B6): ! ORA M %continue sw(16_F6): ! ORI %continue {--------------------------------- POP ------------------------------------} sw(2_11000001): ! POP 0 %continue s%continue {--------------------------------- XOR ------------------------------------} sw(2_10101000): ! XRA 0 %continue sw(2_10101001): ! XRA 1 %continue sw(2_10101010): ! XRA 2 %continue sw(2_10101011): ! XRA 3 %continue sw(2_10101100): ! XRA 4 --------------------------------- ROT ------------------------------------} sw(16_17): ! RAL %continue sw(16_1F): ! RAR %continue sw(16_0F): ! RRC %continue sw(16_07): ! RLC %continue {--------------------------------- RET -------------------------sw(16_E3): ! XTHL %continue %repeat %end %endoffile /12/01/82 CSEP=1,1;AREA=1,2;LISTON=1,3;LISTOFF=1,4 END=1,5;BLOCK=1,6;W=1,7;LOC=1,8;TEXT=1,9;VAR=1,10 ROM=0;RAM=1 B=8,0;C=8,1;D=8,2;E=8,3;H=8,4;L=8,5;A=8,7 BC=9,0;DE=9,1;HL=9,2;SP=9,3;IX=9,4;IY=9,5;AF=9,7 I=10,0;R=10,8 LD=2,16_8000 ADD=2,16_8180;ADC=2,16_81d ? %continue sw(2_11001111): ! RST 1 %continue sw(2_11010111): ! RST 2 %continue sw(2_11011111): ! RST 3 %continue sw(2_11100111): ! RST 4 %continue sw(2_11101111): ! RST 5 %continue sw(2_11110111): ! RST 6 %continue sw(2_11111111): ! RST 7 D=16_AAED;INDR=16_BAED OUTI=16_A3ED;OTIR=16_B3ED;OUTD=16_ABED;OTDR=16_BBED IN=2,16_8600;OUT=2,16_8601 RETI=16_4DED;RETN=16_45ED DAA=16_27 CPL=16_2F NEG=16_44ED CCF=16_3F SCF=16_37 RST=2,16_700 PUSH=2,16_800;POP=2,16_801 IM0=16_46ED;IM1=16_56ED;IM2=16_5EED; %continue sw(2_10011101): ! SBB 5 %continue sw(2_10011110): ! SBB 6 %continue sw(2_10011111): ! SBB 7 %continue sw(16_9E): ! SBB M %continue sw(16_DE): ! SBI %continue {--------------------------------- SHLD -----------------------------------=2,16_45C0;CALL=2,16_C5C4 DJNZ=2,16_510 UNC=5,9 NZ=5,0;Z=5,8;NC=5,16_10;CY=5,16_18 PO=5,16_20;PE=5,16_28;P=5,16_30;N=5,16_38 ----------------------- SUB ------------------------------------} sw(2_10010000): ! SUB 0 %continue sw(2_10010001): ! SUB 1 %continue sw(2_10010010): ! SUB 2 %continue sw(2_10010011): ! SUB 3 %continue sw(2_10010100): ! SUB 4 %continue sw(2_10010ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееD=16_AAED;INDR=16_BAED OUTI=16_A3ED;OTIR=16_B3ED;OUTD=16_ABED;OTDR=16_BBED IN=2,16_8600;OUT=2,16_8601 RETI=16_4DED;RETN=16_45ED DAA=16_27 CPL=16_2F NEG=16_44ED CCF=16_3F SCF=16_37 RST=2,16_700 PUSH=2,16_800;POP=2,16_801 IM0=16_46ED;IM1=16_56ED;IM2=16_5EED;ееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееееее