Code of the original Jewish/Civil Calendar
#This is the code of the MSDOS version. I modified it for the WWW.
#You may use this code for your own purposes if you wish, but notification to me
#that you have done so, and appropriate acknowledgement that this your source,
#would be appreciated.
#The table at the end was created by a separate program, which I ran on a
#128 *kilobyte* Zenith MSDOS computer.
#
#Place this file until the "cut here" line in file called "calendar.icn".
#Place the section from the cut line until the next cut line in a file
#called "calendar.hlp".
#Place the section from the second cut line until the end in a file called
#"calendar.dat". This file must have as its first line the first line of
#data. Remove the cut line.
#The Icon Programming Language translator and executor may be obtained by
#anonymous ftp from cs.arizona.edu in the Icon area. The source code is
#translated by the icont file to a file which is then executed by the
#iconx file. It is available for various platforms. Reference:
#The Icon Programming Language by Griswold and Griswold. (Prentice-Hall)
#A VISUALLY EQUIVALENT JEWISH/CIVIL CALENDAR
#ALAN D. CORRE, University of Wisconsin-Milwaukee
#No guarantees are given or implied as to the correctness of information
#furnished by this program.
#If my math were longer this program would be shorter. Excuse me.
#This work is respectfully devoted to the authors of two books consulted
#with much profit: "A Guide to the Solar-Lunar Calendar" by B. Elihu Rothblatt
#published by our sister Hebrew Dept. in Madison, Wis., and "Kiddush HaHodesh"
#by Rabbenu Moses ben Maimon, on whom be peace.
#The Jewish year harmonizes the solar and lunar cycle, using the 19-year cycle
#of Meton (c. 432 BCE). It corrects so that certain dates shall not fall on
#certain days for religious convenience. The Jewish year has six possible
#lengths, 353,354,355,383,384,385 days, according to day and time of new
#year lunation and position in Metonic cycle. Time figures from 6pm previous
#night. The lunation of year 1 is calculated to be on a Monday (our Sunday
#night) at 11:11:20 pm. Our data table begins with a hypothetical year 0,
#corresponding to 3762 B.C.E. Calculations in this program are figured in
#the ancient Babylonian unit of halaqim "parts" of the hour = 1/1080 hour.
#Version given here should work without change under MS-DOS. Hints are given
#for modifying the code for other systems. Your MS-DOS should be sensitive to
#ANSI screen controls. On many machines you may achieve this by having the
#MS-DOS file ansi.sys available at boot time, and also a file called
#config.sys which contains the statement DEVICE=ANSI.SYS Hints are offered
#in case this is impossible.
#Material consists of three sections separated by legend CUT HERE. This first
#section should be placed in a file called calendar.icn. and compiled with
#icont. Section two should be placed in a file called calendar.hlp.
#The absence of this file will not impede the program. The information in
#this file is unsuitable for the Macintosh.
#Section three should be placed in a file called calendar.dat. This file is
#essential, and must contain no extraneous matter at the beginning.
#Program is run under MS.DOS by entering the command:
# iconx calendar
#which may optionally be followed by the years desired in the form 5750
#for a Jewish year +1990 or 1990AD or 1990CE or -1990 or 1990BC or
#1990BCE for a civil year. On some systems iconx can be omitted.
#This program was written under version 7 of Icon recognizing system
#functions (getch() is used). It should work satisfactorily on the current
#version of Icon.
record date(yr,mth,day)
record molad(day,halaqim)
global cyr,jyr,days_in_jyr,current_molad,current_day,infolist
procedure main(cmd)
clear()
# banner("PERPETUAL JEWISH/CIVIL CALENDAR","","by","","ALAN D. CORRE")
if *cmd = 0 then {
#putting an asterisk indicates that user might need help
n := 1; put(cmd,"*")} else
n := *cmd
every p := 1 to n do {
initialize(cmd[p])
process()}
end
procedure banner(l[])
#Creates a banner to begin programs. If you don't have the extended ASCII
#character set, replace each char(n) with some character that you have
#such as " " or "-"
#Does not work well if your screen has variable spacing.
local n
write();write();write()
writes(char(24)) #top left right angle
writes(repl(char(24),78)) #straight line
writes(char(24)) #top right right angle
writes(char(24)) #upright line at left
writes(right(char(24,79))) #upright line at right
every n := 1 to *l do {
writes(char(24)) #upright line at left
writes(center(l[n],78),char(24)) #string centered followed by upright line
writes(char(24)) #upright line at left
writes(right(char(24),79)) #upright line at right
}
writes(char(24)) #bottom left right angle
writes(repl(char(24),78)) #straight line
write(char(24)) #bottom right right angle
write()
return
end
procedure instructions(filename)
#Gives user access to a help file which is printed out in chunks.
local filvar,counter,line
writes("Do you need instructions? y/n ")
if upto('yY',read()) then {
#The following if-statement fails if the file is not available
counter := 0
if filvar := open(filename) then
#Read the help file.
while line := read(filvar) do {
#Write out a line and increment the counter
write(line)
counter +:= 1
#Now we have a screenful; ask if we should continue
if counter >22 then {
write()
writes ("More? y/n ")
#User has had enough; break out of loop
if upto('nN',read()) then break else
#User wants more; reset counter and continue
counter := 0}} else
#This else goes with the second if-statement; the attempt to open the
#help file failed:
write("Sorry, instructions not available.")}
write ("Press return to continue.")
read()
#Close the file if it existed and was opened. If it was never opened
#the value of filvar will be null. This check has to be made because
#an attempt to use close() on a variable NOT valued at a file would
#cause an error.
/filvar | close(filvar)
end
procedure clear()
#clears the screen. If you don't have ANSI omit the next line
writes("\e[2J")
end
procedure initialize_list()
#while user views banner, put info of calendar.dat into a global list
local infile,n
infolist := list(301)
if not (infile := open("calendar.dat")) then
stop("This program must have the file CALENDAR.DAT on line in order to _
function properly.")
#the table is arranged arbitrarily at twenty year intervals with 301 entries.
every n := 1 to 301 do
infolist[n] := read(infile)
close(infile)
end
procedure initialize_variables()
#get the closest previous year in the table
local line,quotient
quotient := jyr.yr / 20 + 1
#only 301 entries. Figure from last if necessary.
if quotient > 301 then quotient := 301
#pull the appropriate info, put into global variables
line := infolist[quotient]
line ? { current_molad.day := tab(upto('%'))
move(1)
current_molad.halaqim := tab(upto('%'))
move(1)
cyr.mth := tab(upto('%'))
move(1)
cyr.day := tab(upto('%'))
move(1)
cyr.yr := tab(upto('%'))
days_in_jyr := line[-3:0]
}
#begin at rosh hashana
jyr.day := 1
jyr.mth := 7
return
end
procedure initialize(yr)
local year
#initialize global variables
initial { cyr := date(0,0,0)
jyr := date(0,0,0)
current_molad := molad(0,0)
initialize_list()}
clear()
#user may need help
if yr == "*" then {
instructions("calendar.hlp")
clear()
writes("Please enter the year. If you are entering a CIVIL year, precede _
by + for \ncurrent era, - (the minus sign) for before current era. ")
year := read()} else
year := yr
while not (jyr.yr := cleanup(year)) do {
writes("I do not understand ",year,". Please try again ")
year := read()}
clear()
initialize_variables()
return
end
procedure cleanup(str)
#tidy up the string. Bugs still possible.
if upto('+',str,2) then fail
if (not upto('.+-',str)) & integer(str) & (str > 0) then return str
if upto('-bB',str) then return (0 < (3761 - checkstr(str)))
if upto('+cCaA',str) then return (checkstr(str) + 3760)
fail
end
procedure checkstr(s)
#does preliminary work on string before cleanup() cleans it up
local letter,n,newstr
newstr := ""
every n := 1 to *s do
if integer(s[n]) then
newstr ||:= s[n]
if (*newstr = 0) | (newstr = 0) then fail
return newstr
end
procedure process()
#gets out the information
local limit,dj,dc
#this contains a correction
#6039 is last year handled by the table in the usual way
#The previous line should read 6019. Code has been corrected to erase
#this mistake.
if jyr.yr <= 6019 then {
limit := jyr.yr % 20
jyr.yr := ((jyr.yr / 20) * 20)} else {
#otherwise figure from 6020 and good luck
#This has been corrected to 6000
limit := jyr.yr - 6000
jyr.yr := 6000}
ans := "y"
establish_jyr()
every 1 to limit do {
#tell user something is going on
writes(" .")
#increment the years, establish the type of Jewish year
cyr_augment()
jyr_augment()
establish_jyr()}
clear()
write()
while upto('Yy',ans) do {
yj := jyr.yr
dj := days_in_jyr
every n := 1 to 4 do {
clear()
every 1 to 3 do
write_a_month()
write("Press return to continue")
write()
writes(status_line(yj,dj))
#be sure that your version of Icon recognises the function getch()
read()}
if jyr.mth = 6 then {
clear()
write_a_month()
every 1 to 15 do write()
write(status_line(yj,dj))}
write()
writes("Do you wish to continue? Enter y or n and hit return.y/n ")
#be sure that your version of Icon recognises the function getch()
ans := read()}
return
end
procedure cyr_augment()
#Make civil year a year later, we only need consider Aug,Sep,Oct.
local days,newmonth,newday
if cyr.mth = 8 then
days := 0 else
if cyr.mth = 9 then
days := 31 else
if cyr.mth = 10 then
days := 61 else
stop("Error in cyr_augment")
writes(" .")
days := (days + cyr.day-365+days_in_jyr)
if isleap(cyr.yr + 1) then days -:= 1
#cos it takes longer to get there
if days <= 31 then {newmonth := 8; newday := days} else
if days <= 61 then {newmonth := 9; newday := days-31} else
{newmonth := 10; newday := days-61}
cyr.mth := newmonth
cyr.day := newday
cyr.yr +:= 1
if cyr.yr = 0 then cyr.yr := 1
return
end
procedure header()
#creates the header for Jewish and English side. If ANSI not available,
#substitute "S" for "\e[7mS\e[0m" each time.
write(repl(" ",7),"S",repl(" ",2),"M",repl(" ",2),"T",repl(" ",2),"W",
repl(" ",2),"T",repl(" ",2),"F",repl(" ",2),"\e[7mS\e[0m",repl(" ",27),
"S",repl(" ",2),"M",repl(" ",2),"T",repl(" ",2),"W",
repl(" ",2),"T",repl(" ",2),"F",repl(" ",2),"\e[7mS\e[0m")
end
procedure write_a_month()
#writes a month on the screen
header()
every 1 to 5 do
write(make_a_line())
if jyr.day ~= 1 then
write(make_a_line())
write()
return
end
procedure status_line(a,b)
#create the status line at the bottom of screen
local sline,c,d
c := cyr.yr
if (cyr.day = 1) & (cyr.mth = 1) then c -:= 1
d := 365
if isleap(c) then d := 366
#if ANSI not available omit "\e[7m" and "|| "\e[0m""
sline := ("\e[7mYear of Creation: " || a || " Days in year: " || b ||
" Civil year: " || c || " Days in year: " || d || "\e[0m")
return sline
end
procedure make_a_line()
#make a single line of the months
local line,blanks1,blanks2,start_point,end_point,flag,fm
#consider the first line of the month
if jyr.day = 1 then {
line := mth_table(jyr.mth,1)
#setting flag means insert civil month at end of line
flag := 1 } else
line := repl(" ",3)
#consider the case where first day of civil month is on Sunday
if (cyr.day = 1) & (current_day = 1) then flag := 1
#space between month name and beginning of calendar
line ||:= repl(" ",2)
#measure indentation for first line
line ||:= blanks1 := repl(" ",3*(current_day-1))
#establish start point for Hebrew loop
start_point := current_day
#establish end point for Hebrew loop and run civil loop
every end_point := start_point to 7 do {
line ||:= right(jyr.day,3)
if not j_augment() then {jyr_augment(); establish_jyr(); current_day -:= 1; if current_day = 0 then current_day := 7}
d_augment()
if jyr.day = 1 then break }
#measure indentation for last line
blanks2 := repl(" ",3*(7-end_point))
line ||:= blanks2; line ||:= repl(" ",25); line ||:= blanks1
every start_point to end_point do {
line ||:= right(cyr.day,3)
if (cyr.day = 1) then flag := 1
augment()}
line ||:= blanks2 ||:= repl(" ",3)
fm := cyr.mth
if cyr.day = 1 then
if cyr.mth = 1 then fm := 12 else fm := cyr.mth - 1
if \flag then line ||:= mth_table(fm,2) else
line ||:= repl(" ",3)
return line
end
procedure mth_table(n,p)
#generates the short names of Jewish and Civil months. Get to civil side
#by adding 13 (=max no of Jewish months)
static corresp
initial corresp := ["NIS","IYA","SIV","TAM","AV ","ELU","TIS","HES","KIS",
"TEV","SHE","ADA","AD2","JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP",
"OCT","NOV","DEC"]
if (p ~= 1) & (p ~= 2) then stop("ERROR IN MTH-TABLE") else
if p = 2 then n +:= 13
return corresp[n]
end
procedure d_augment()
#increment the day of the week
current_day +:= 1
if current_day = 8 then current_day := 1
return
end
procedure augment()
#increments civil day, modifies month and year if necessary, stores in
#global variable cyr
if cyr.day < 28 then
cyr.day +:= 1 else
if cyr.day = 28 then {
if (cyr.mth ~= 2) | ((cyr.mth = 2) & isleap(cyr.yr)) then
cyr.day := 29 else {
cyr.mth := 3
cyr.day := 1}} else
if cyr.day = 29 then {
if cyr.mth ~= 2 then
cyr.day := 30 else {
cyr.mth := 3
cyr.day := 1}} else
if cyr.day = 30 then {
if is_31(cyr.mth) then
cyr.day := 31 else {
cyr.mth +:= 1
cyr.day := 1}} else {
cyr.day := 1
if cyr.mth ~= 12 then
cyr.mth +:= 1 else {
cyr.mth := 1
cyr.yr +:= 1
if cyr.yr = 0
then cyr.yr := 1}}
return
end
procedure is_31(n)
#civil months with 31 days
return n = 1 | n = 3 | n = 5 | n = 7 | n = 8 | n = 10 | n = 12
end
procedure isleap(n)
#checks for civil leap year
if n > 0 then
return (n % 400 = 0) | ((n % 4 = 0) & (n % 100 ~= 0)) else
return (n % 400 = -1) | ((n % 4 = -1) & (n % 100 ~= -1))
end
procedure j_augment()
#increments jewish day. months are numbered from nisan, adar sheni is 13.
#procedure fails at elul to allow determination of type of new year
if jyr.day < 29 then
jyr.day +:= 1 else
if (jyr.day = 30) | always_29(jyr.mth) | ((jyr.mth = 8) &
(days_in_jyr % 5 ~= 0)) | ((jyr.mth = 9) & ((days_in_jyr = 353) |
(days_in_jyr = 383))) then
jyr.mth +:= jyr.day := 1 else
if jyr.mth = 6 then fail else
if ((jyr.mth = 12) & (days_in_jyr < 383)) | (jyr.mth = 13) then
jyr.mth := jyr.day := 1 else
jyr.day := 30
return
end
procedure always_29(n)
#uncomplicated jewish months with 29 days
return n = 2 | n = 4 | n = 10
end
procedure jyr_augment()
#determines the current time of lunation, using the ancient babylonian unit
#of 1/1080 of an hour. lunation of tishri determines type of year. allows
#for leap year. halaqim = parts of the hour
local days, halaqim
days := current_molad.day + 4
if days_in_jyr <= 355 then {
halaqim := current_molad.halaqim + 9516
days := ((days +:= halaqim / 25920) % 7)
if days = 0 then days := 7
halaqim := halaqim % 25920} else {
days +:= 1
halaqim := current_molad.halaqim + 23269
days := ((days +:= halaqim / 25920) % 7)
if days = 0 then days := 7
halaqim := halaqim % 25920}
current_molad.day := days
current_molad.halaqim := halaqim
#reset the global variable which holds the current jewish date
jyr.yr +:= 1 #increment year
jyr.day := 1
jyr.mth := 7
establish_jyr()
return
end
procedure establish_jyr()
#establish the jewish year from get_rh
local res
res := get_rh(current_molad.day,current_molad.halaqim,no_lunar_yr(jyr.yr))
days_in_jyr := res[2]
current_day := res[1]
return
end
procedure isin1(i)
#the isin procedures are sets of years in the Metonic cycle
return i = (1 | 4 | 7 | 9 | 12 | 15 | 18)
end
procedure isin2(i)
return i = (2 | 5 | 10 | 13 | 16)
end
procedure isin3(i)
return i = (3 | 6 | 8 | 11 | 14 | 17 | 0)
end
procedure isin4(i)
return i = (1 | 2 | 4 | 5 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18)
end
procedure isin5(i)
return i = (1 | 4 | 9 | 12 | 15)
end
procedure isin6(i)
return i = (2 | 5 | 7 | 10 | 13 | 16 | 18)
end
procedure no_lunar_yr(i)
#what year in the metonic cycle is it?
return i % 19
end
procedure get_rh(d,h,yr)
#this is the heart of the program. check the day of lunation of tishri
#and determine where breakpoint is that sets the new moon day in parts
#of the hour. return result in a list where 1 is day of rosh hashana and
#2 is length of jewish year
local c,result
c := no_lunar_yr(yr)
result := list(2)
if d = 1 then {
result[1] := 2
if (h < 9924) & isin4(c) then result[2] := 353 else
if (h < 22091) & isin3(c) then result[2] := 383 else
if (h > 9923) & (isin1(c) | isin2(c)) then result[2] := 355 else
if (h > 22090) & isin3(c) then result[2] := 385
} else
if d = 2 then {
if ((h < 16789) & isin1(c)) |
((h < 19440) & isin2(c)) then {
result[1] := 2
result[2] := 355
} else
if (h < 19440) & isin3(c) then {
result[1] := 2
result[2] := 385
} else
if ((h > 16788) & isin1(c)) |
((h > 19439) & isin2(c)) then {
result[1] := 3
result[2] := 354
} else
if (h > 19439) & isin3(c) then {
result[1] := 3
result[2] := 384
}
} else
if d = 3 then {
if (h < 9924) & (isin1(c) | isin2(c)) then {
result[1] := 3
result[2] := 354
} else
if (h < 19440) & isin3(c) then {
result[1] := 3
result[2] := 384
} else
if (h > 9923) & isin4(c) then {
result[1] := 5
result[2] := 354
} else
if (h > 19439) & isin3(c) then {
result[1] := 5
result[2] := 383}
} else
if d = 4 then {
result[1] := 5
if isin4(c) then result[2] := 354 else
if h < 12575 then result[2] := 383 else
result[2] := 385
} else
if d = 5 then {
if (h < 9924) & isin4(c) then {
result[1] := 5
result[2] := 354} else
if (h < 19440) & isin3(c) then {
result[1] := 5
result[2] := 385
} else
if (9923 < h < 19440) & isin4(c) then {
result[1] := 5
result[2] := 355
} else
if h > 19439 then {
result[1] := 7
if isin3(c) then result[2] := 383 else
result[2] := 353
}
} else
if d = 6 then {
result[1] := 7
if ((h < 408) & isin5(c)) | ((h < 9924) & isin6(c)) then
result[2] := 353 else
if ((h < 22091) & isin3(c)) then result[2] := 383 else
if ((h > 407) & isin5(c)) | ((h > 9923) & isin6(c)) then
result[2] := 355 else
if (h > 22090) & isin3(c) then result[2] := 385
} else
if d = 7 then if (h < 19440) & (isin5(c) | isin6(c)) then {
result[1] := 7
result[2] := 355
} else
if (h < 19440) & isin3(c) then {
result[1] := 7
result[2] := 385
} else {
result[1] := 2
if isin4(c) then
result[2] := 353 else
result[2] := 383}
return result
end
#If the following help file doesnt quite look right try throwing in a
#few blank lines here or there, or take them out.
# [cut here]----------------------------------------------------------
This program accepts a year of the Jewish calendar, for example
"5750", and produces on the screen a calendar of that year with a
visually equivalent civil calendar opposite it for easy conversion of
dates. The months of the civil year are abbreviated to
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
and of the Jewish calendar to
NIS IYA SIV TAM AV ELU TIS HES KIS TEV SHE ADA AD2.
Months are normally displayed three at a time. You call up the next
three by hitting return. At the end of the year you can indicate if
you wish the program to conclude, by hitting return again. If in
response to the question, Do you wish to continue? you enter "y" and
hit return, the next year will be displayed.
Each Jewish month has its name on the left. The corresponding secular
dates will have the name of the month on the right, and when the month
changes it will be indicated on the right also.
If you wish, you may enter a civil year in the form -70 for BCE dates
and +70 for CE dates. The Jewish year beginning prior to Jan 1 of that
year will be displayed, and you can continue with the next Jewish year
if you wish to complete the desired civil year.
You may enter CE or AD instead of + or BC or BCE instead of the minus
sign if you wish. It is best to avoid spaces, so enter 1987AD, for
example. [Added note 2002: If you happen to be using the Opera browser,
you must use this format for CE dates. This is because the
Opera browser does not encode the plus sign, and so treats it as a
space. This appears to me to be a bug in the browser.]
The year 0 is not meaningful in either calendar. No date prior to 1
in the Jewish calendar should be entered. The program will calculate
any future year, but will take longer for years much beyond the year
6020 in the Jewish reckoning. For example, the year 7000 will take
three minutes or so to appear. Earlier years should appear in a few
seconds.
A status line at the bottom of the screen indicates the civil and
Jewish year, and the number of days in each. Jewish years may contain
354, 355, 356, 384, 385 or 386 days according to circumstances.
When you are familiar with this program you can enter the years you
wish to see on the command line. For example, if you call the program
CALENDAR 5704 +1987 1BC
you will see in turn the Jewish year 5704, the Jewish year commencing
in 1986 and the Jewish year commencing in 2 B.C.E. You still have the
option of seeing the years subsequent to these years if you wish. Just
enter "y" when asked if you want to continue. When you enter "n", you
will get the next year of your list.
All civil dates are according to the Gregorian Calendar which first
came into use in 1582 and was accepted in different places at
different times. Prior to that date the Julian calendar was in use. At
the present time the Julian calendar is 13 days behind the Gregorian
Calendar, so that March 15 1917 in our reckoning is March 2 in the
Julian Calendar. The following table shows the number of days that
must be subtracted from the Gregorian date given here to find the Julian
date. In the centuries before the current era the calendar was
intercalated erratically, so a simple subtraction is not possible. Note that
the change in the number to subtract applies from March 1 in the century
year, since in the Julian Calendar that will be February 29 except in years
divisible by 400 which are leap years in the Gregorian calendar also.
Century # to subtract Century # to subtract
21 13 11 6
20 13 10 5
19 12 9 4
18 11 8 4
17 10 7 3
16 10 6 2
15 9 5 1
14 8 4 1
13 7 3 0
12 7 2 -1
1 -2
Note: this program was implemented for a z-29 terminal assuming ANSI mode.
This version is for MS-DOS obeying ANSI commands. It has lately been
modified slightly for CGI use on the World Wide Web. I have not published
the code of this latter version, since I have not bothered to tidy it up,
and it does not look pretty.
cut here------------------------------------------------------------------
3%8255%8%20%-3762%384
4%23479%9%8%-3742%354
4%24950%8%28%-3722%354
5%501%8%17%-3702%385
6%15725%9%6%-3682%355
6%17196%8%26%-3662%355
6%18667%8%15%-3642%383
1%7971%9%3%-3622%353
1%9442%8%23%-3602%383
2%24666%9%10%-3582%354
3%217%8%30%-3562%354
3%1688%8%19%-3542%384
4%16912%9%7%-3522%354
4%18383%8%27%-3502%354
4%19854%8%17%-3482%385
6%9158%9%5%-3462%355
6%10629%8%25%-3442%355
6%12100%8%14%-3422%383
1%1404%9%2%-3402%353
1%2875%8%23%-3382%383
2%18099%9%10%-3362%354
2%19570%8%30%-3342%354
2%21041%8%19%-3322%384
4%10345%9%7%-3302%354
4%11816%8%28%-3282%354
4%13287%8%17%-3262%385
6%2591%9%5%-3242%353
6%4062%8%25%-3222%383
7%19286%9%11%-3202%355
7%20757%9%2%-3182%353
7%22228%8%22%-3162%383
2%11532%9%8%-3142%355
2%13003%8%28%-3122%355
2%14474%8%17%-3102%385
4%3778%9%7%-3082%354
4%5249%8%27%-3062%354
4%6720%8%16%-3042%383
5%21944%9%4%-3022%353
5%23415%8%24%-3002%383
7%12719%9%11%-2982%355
7%14190%8%31%-2962%355
7%15661%8%20%-2942%385
2%4965%9%8%-2922%355
2%6436%8%28%-2902%355
2%7907%8%18%-2882%385
3%23131%9%7%-2862%354
3%24602%8%27%-2842%383
5%13906%9%13%-2822%355
5%15377%9%2%-2802%355
5%16848%8%22%-2782%385
7%6152%9%10%-2762%355
7%7623%8%30%-2742%355
7%9094%8%19%-2722%385
1%24318%9%7%-2702%355
1%25789%8%28%-2682%355
2%1340%8%17%-2662%385
3%16564%9%6%-2642%354
3%18035%8%24%-2622%384
5%7339%9%12%-2602%354
5%8810%9%2%-2582%354
5%10281%8%22%-2562%385
6%25505%9%10%-2542%355
7%1056%8%30%-2522%355
7%2527%8%19%-2502%385
1%17751%9%8%-2482%355
1%19222%8%28%-2462%383
3%8526%9%15%-2442%354
3%9997%9%6%-2422%354
3%11468%8%24%-2402%384
5%772%9%12%-2382%354
5%2243%9%1%-2362%354
5%3714%8%21%-2342%385
6%18938%9%9%-2322%355
6%20409%8%29%-2302%355
6%21880%8%19%-2282%383
1%11184%9%7%-2262%355
1%12655%8%27%-2242%383
3%1959%9%14%-2222%354
3%3430%9%3%-2202%354
3%4901%8%24%-2182%384
4%20125%9%12%-2162%354
4%21596%9%1%-2142%354
4%23067%8%21%-2122%385
6%12371%9%9%-2102%355
6%13842%8%30%-2082%383
1%3146%9%18%-2062%353
1%4617%9%7%-2042%353
1%6088%8%27%-2022%383
2%21312%9%14%-2002%354
2%22783%9%3%-1982%354
2%24254%8%23%-1962%384
4%13558%9%11%-1942%354
4%15029%8%31%-1922%354
4%16500%8%20%-1902%385
6%5804%9%9%-1882%353
6%7275%8%29%-1862%383
7%22499%9%17%-1842%353
7%23970%9%6%-1822%353
7%25441%8%26%-1802%383
2%14745%9%13%-1782%355
2%16216%9%2%-1762%355
2%17687%8%22%-1742%385
4%6991%9%11%-1722%354
4%8462%8%31%-1702%383
5%23686%9%20%-1682%353
5%25157%9%9%-1662%353
6%708%8%29%-1642%383
7%15932%9%15%-1622%355
7%17403%9%4%-1602%355
7%18874%8%24%-1582%385
2%8178%9%12%-1562%355
2%9649%9%1%-1542%355
2%11120%8%21%-1522%385
4%424%9%10%-1502%354
4%1895%8%31%-1482%383
5%17119%9%17%-1462%355
5%18590%9%6%-1442%355
5%20061%8%28%-1422%383
7%9365%9%14%-1402%355
7%10836%9%4%-1382%355
7%12307%8%24%-1362%385
2%1611%9%12%-1342%355
2%3082%9%1%-1322%385
3%18306%9%21%-1302%354
3%19777%9%11%-1282%354
3%21248%8%31%-1262%383
5%10552%9%17%-1242%355
5%12023%9%6%-1222%355
5%13494%8%26%-1202%385
7%2798%9%14%-1182%355
7%4269%9%3%-1162%355
7%5740%8%23%-1142%385
1%20964%9%11%-1122%355
1%22435%8%31%-1102%385
3%11739%9%21%-1082%354
3%13210%9%10%-1062%354
3%14681%8%28%-1042%384
5%3985%9%16%-1022%354
5%5456%9%5%-1002%354
5%6927%8%26%-982%385
6%22151%9%14%-962%355
6%23622%9%3%-942%385
1%12926%9%22%-922%355
1%14397%9%11%-902%355
1%15868%9%1%-882%383
3%5172%9%19%-862%354
3%6643%9%8%-842%354
3%8114%8%28%-822%384
4%23338%9%16%-802%354
4%24809%9%5%-782%354
5%360%8%25%-762%385
6%15584%9%13%-742%355
6%17055%9%2%-722%383
1%6359%9%21%-702%353
1%7830%9%11%-682%353
1%9301%8%31%-662%383
2%24525%9%18%-642%354
3%76%9%7%-622%354
3%1547%8%27%-602%384
4%16771%9%16%-582%354
4%18242%9%5%-562%385
6%7546%9%24%-542%355
6%9017%9%13%-522%353
6%10488%9%2%-502%383
7%25712%9%22%-482%353
1%1263%9%11%-462%353
1%2734%8%31%-442%383
2%17958%9%18%-422%354
2%19429%9%6%-402%355
2%20900%8%27%-382%384
4%10204%9%15%-362%354
4%11675%9%4%-342%383
6%979%9%23%-322%355
6%2450%9%12%-302%353
6%3921%9%2%-282%383
7%19145%9%19%-262%355
7%20616%9%10%-242%353
7%22087%8%30%-222%383
2%11391%9%16%-202%355
2%12862%9%6%-182%385
4%2166%9%26%-162%354
4%3637%9%15%-142%354
4%5108%9%4%-122%383
5%20332%9%23%-102%353
5%21803%9%13%-82%353
5%23274%9%2%-62%383
7%12578%9%19%-42%355
7%14049%9%8%-22%355
7%15520%8%28%-2%385
2%4824%9%16%19%355
2%6295%9%5%39%385
3%21519%9%25%59%354
3%22990%9%14%79%354
3%24461%9%3%99%383
5%13765%9%21%119%355
5%15236%9%10%139%355
5%16707%8%30%159%385
7%6011%9%18%179%355
7%7482%9%7%199%385
1%22706%9%27%219%355
1%24177%9%16%239%355
1%25648%9%5%259%385
3%14952%9%25%279%354
3%16423%9%14%299%354
3%17894%9%2%319%384
5%7198%9%21%339%354
5%8669%9%10%359%354
5%10140%8%30%379%385
6%25364%9%18%399%355
7%915%9%7%419%385
1%16139%9%26%439%355
1%17610%9%15%459%355
1%19081%9%4%479%383
3%8385%9%22%499%354
3%9856%9%12%519%354
3%11327%9%1%539%384
5%631%9%20%559%354
5%2102%9%9%579%385
6%17326%9%28%599%355
6%18797%9%18%619%355
6%20268%9%7%639%383
1%9572%9%26%659%353
1%11043%9%15%679%355
1%12514%9%4%699%383
3%1818%9%23%719%354
3%3289%9%12%739%354
3%4760%9%1%759%384
4%19984%9%20%779%354
4%21455%9%9%799%385
6%10759%9%28%819%355
6%12230%9%17%839%355
6%13701%9%6%859%383
1%3005%9%25%879%353
1%4476%9%14%899%353
1%5947%9%4%919%383
2%21171%9%22%939%354
2%22642%9%11%959%384
4%11946%9%30%979%354
4%13417%9%19%999%354
4%14888%9%9%1019%385
6%4192%9%28%1039%355
6%5663%9%17%1059%353
6%7134%9%6%1079%383
7%22358%9%25%1099%353
7%23829%9%15%1119%353
7%25300%9%4%1139%383
2%14604%9%21%1159%355
2%16075%9%10%1179%385
4%5379%9%30%1199%354
4%6850%9%19%1219%354
4%8321%9%8%1239%383
5%23545%9%27%1259%353
5%25016%9%16%1279%353
6%567%9%5%1299%383
7%15791%9%23%1319%355
7%17262%9%12%1339%385
2%6566%10%1%1359%355
2%8037%9%20%1379%355
2%9508%9%9%1399%385
3%24732%9%30%1419%354
4%283%9%19%1439%354
4%1754%9%8%1459%383
5%16978%9%25%1479%355
5%18449%9%14%1499%355
5%19920%9%6%1519%383
7%9224%9%23%1539%355
7%10695%9%12%1559%385
1%25919%10%1%1579%355
2%1470%9%20%1599%355
2%2941%9%9%1619%385
3%18165%9%29%1639%354
3%19636%9%18%1659%354
3%21107%9%7%1679%383
5%10411%9%24%1699%355
5%11882%9%14%1719%385
7%1186%10%3%1739%355
7%2657%9%22%1759%355
7%4128%9%11%1779%385
1%19352%9%30%1799%355
1%20823%9%20%1819%355
1%22294%9%9%1839%385
3%11598%9%29%1859%354
3%13069%9%18%1879%354
3%14540%9%5%1899%384
5%3844%9%25%1919%354
5%5315%9%14%1939%385
6%20539%10%3%1959%355
6%22010%9%22%1979%355
6%23481%9%11%1999%385
1%12785%9%30%2019%355
1%14256%9%19%2039%355
1%15727%9%8%2059%383
3%5031%9%26%2079%354
3%6502%9%15%2099%384
4%21726%10%5%2119%354
4%23197%9%24%2139%354
4%24668%9%13%2159%385
6%13972%10%2%2179%355
6%15443%9%21%2199%355
6%16914%9%11%2219%383
1%6218%9%30%2239%353
More information on the Icon
Programming Language?
Go back to Front Frame
Alan D. Corré
corre@uwm.edu