diff options
author | Thorsten Behrens <tbehrens@suse.com> | 2013-01-15 16:59:48 +0100 |
---|---|---|
committer | Thorsten Behrens <tbehrens@suse.com> | 2013-01-15 16:59:48 +0100 |
commit | ab999f2adec4b3a5cb2b71e03b771e3f44d70dc3 (patch) | |
tree | af734f8501df01ddca14614fd10cb6236335b243 | |
parent | 9f5dfedb83704de78e9c57726e78f330ef14e105 (diff) |
New poll: 2013 LibOCon location
-rw-r--r-- | configure.in | 1 | ||||
-rw-r--r-- | vote/2013-confpoll/Makefile.am | 14 | ||||
-rw-r--r-- | vote/2013-confpoll/candidates.wml | 87 | ||||
-rw-r--r-- | vote/2013-confpoll/index.wml | 51 | ||||
-rwxr-xr-x | vote/2013-confpoll/mkical.py | 250 | ||||
-rw-r--r-- | vote/2013-confpoll/rules.wml | 104 | ||||
-rw-r--r-- | vote/2013-confpoll/timeline.ics | 67 | ||||
-rw-r--r-- | vote/2013-confpoll/voting-instructions.txt | 40 | ||||
-rw-r--r-- | vote/Makefile.am | 2 | ||||
-rw-r--r-- | vote/index.wml | 1 |
10 files changed, 616 insertions, 1 deletions
diff --git a/configure.in b/configure.in index 981746b..e285942 100644 --- a/configure.in +++ b/configure.in @@ -18,4 +18,5 @@ vote/include/Makefile vote/2011/Makefile vote/2012-confpoll/Makefile vote/2012-mc/Makefile +vote/2013-confpoll/Makefile ]) diff --git a/vote/2013-confpoll/Makefile.am b/vote/2013-confpoll/Makefile.am new file mode 100644 index 0000000..7216e31 --- /dev/null +++ b/vote/2013-confpoll/Makefile.am @@ -0,0 +1,14 @@ +SUBDIRS = + +urlpath = /vote/2013-confpoll + +page_SCRIPTS = \ + index.html \ + candidates.html\ + rules.html + +page_DATA = \ + timeline.ics + mkical.py + +include $(top_srcdir)/rules.common diff --git a/vote/2013-confpoll/candidates.wml b/vote/2013-confpoll/candidates.wml new file mode 100644 index 0000000..9981dcc --- /dev/null +++ b/vote/2013-confpoll/candidates.wml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html> + + <head> + <title>The LibreOffice 2013 Conference Location Candidates</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + </head> + + <body> + <h1>Candidates for the LibreOffice 2013 Conference</h1> + + <p> + Below you will find a list of candidates who applied for running + the LibreOffice 2013 conference. A short summary statement from + each candidate and a link to their full application is provided + to help you learn more about them. Please refer to the <a + href="http://listarchives.documentfoundation.org/www/discuss/">discuss@documentfoundation.org</a> + list for further information, and for questions towards the + candidates. The announcement blog post about the applicants is + <a href="http://blog.documentfoundation.org/2012/12/17/libreoffice-conference-2013-proposals/">here</a>. + </p> + + <p> + If you have any questions, please send them to either + <a href="http://listarchives.documentfoundation.org/www/discuss/">discuss@documentfoundation.org</a> + or to the board at <a + href="mailto:info@documentfoundation.org">info@documentfoundation.org</a>. + </p> + + <h2>List of proposals for the LibreOffice 2013 conference</h2> + + <ol> + <li><strong>Milano, Italy</strong><br /> + Full application at <a href="http://documentfoundation.files.wordpress.com/2012/12/milan2013.pdf">http://tdfsc.files.wordpress.com/2012/01/libocon2012_berlin_proposal.pdf</a> + <blockquote> +Milan is the second largest city in Italy, and the largest +metropolitan area with over 5 million people. The city has several +universities plus a polytechnic school, and hosts the headquarters of +the largest IT companies in Italy. Milan is also rich in history and +arts, with monuments dating back to the 5th century and several +masterpieces like the Duomo and Leonardo's Last Supper. It is also the +fashion capital of Italy, and a financial and commercial city. The +LibreOffice Conference 2013 will be organized by a group of +enthusiastic individuals and organizations, gathered around the IT +Department of the State University, which will be the main venue for +the event. The conference will be the launch event for the Italian +association: LibreItalia. LibreOffice is at the heart of several of +the most important migrations projects in Italy, including Provincia +di Milano and Regione Umbria.. Milan is served by three airports, +with direct flights to most European cities and several destinations +in America, Africa and Asia Pacific. + </blockquote> + </li> + <li><strong>Montreal, Canada</strong><br /> + Full application at <a href="http://documentfoundation.files.wordpress.com/2012/12/montreal2013.pdf">http://tdfsc.files.wordpress.com/2012/01/libocon2012_zaragoza_proposal.pdf</a> + <blockquote> +Montreal is an internationally recognized high-tech hub and ranks +second in North America for hosting international meetings. It has a +strong and solid local FLOSS community, and as a French-speaking city +on the North American continent, it is the natural bridge between the +free/libre and open source software (FLOSS) communities on both sides +of the Atlantic. Its night life is famous, with 11 university +establishments, including four major universities (two French- +language, two English-language), hosting a higher percentage of +university students compared to the overall population than any other +major city in North America. Montreal is an internationally recognized +high-tech hub, information and communication technology clusters +employ 100k+ people in 5,000 establishments and is among the most +dynamic in the world both for its creativity and cutting edge +technology. + </blockquote> + </li> + + </ol> + + + <h2>Additional Poll-related Information</h2> + + <p> + If you have any futher question, please consult the + <a href="rules.html">Rules for this poll</a> or write to + <a href="mailto:info@documentfoundation.org">info@documentfoundation.org</a>. + </p> + + </body> +</html> diff --git a/vote/2013-confpoll/index.wml b/vote/2013-confpoll/index.wml new file mode 100644 index 0000000..8905d01 --- /dev/null +++ b/vote/2013-confpoll/index.wml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html> + + <head> + <title>The LibreOffice 2013 Conference Location Poll</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + <meta name="author" content="Thorsten Behrens" /> + </head> + + <body> + + <h1>The LibreOffice 2013 Conference Location Poll</h1> + + <p> + The Document Foundation Membership is asked to vote for one of + our <a href="http://blog.documentfoundation.org/2012/12/17/libreoffice-conference-2013-proposals/">two conference location proposals</a>. + </p> + + <p> + The poll results from the LibreOffice 2013 Conference Location Poll + will be archived here for public access. + </p> + + <h2>LibreOffice 2013 Conference Poll Materials:</h2> + <ul> + <li> + <a href="../results.php?election_id=4">Detailed election results</a> + </li> + <li> + <a href="../votes.php?election_id=4">List of all votes</a> + </li> + <li> + <a href="../vote.php?election_id=4">Interface to vote</a> + </li> + <li> + <a href="candidates.html">List of conference location candidates</a> + </li> + + <li> + <a href="http://www.documentfoundation.org/foundation/members/">List of registered voters</a> + </li> + + <li> + <a href="rules.html">Elections Rules and Timeline</a> (webcal <a + href="webcal://elections.documentfoundation.org/voting/vote/2013-confpoll/timeline.ics">timeline</a>) + </li> + </ul> + + </body> +</html> diff --git a/vote/2013-confpoll/mkical.py b/vote/2013-confpoll/mkical.py new file mode 100755 index 0000000..5a901d4 --- /dev/null +++ b/vote/2013-confpoll/mkical.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python +''' +This Python script creates a simple iCal file based on hardcoded events +in this file. +''' + +import calendar +import datetime +import logging +import math +import os +import vobject + + +#### Configure these variables +YEAR = 2013 +CANDIDATES_OPENED_DATE = (2012, 10, 2) +CANDIDATES_CLOSED_DATE = (2012, 12, 16) +CANDIDATES_ANNOUNCED_DATE = (2012, 12, 17) +VOTING_OPENED_DATE = (YEAR, 1, 16) +VOTING_CLOSED_DATE = (YEAR, 2, 4) +PRELIMINARY_RESULTS_DATE = (YEAR, 2, 5) +CHALLENGE_CLOSED_DATE = (YEAR, 2, 8) + + + +### I'm sorry that these functions clutter your calendar-creating experience +### Please scroll down a bit to edit the description texts + +#### Application Data +def c(multilinestring): + ''' + A helper functions which cleans up a multiline string, so that + it doesn't contain any newlines or multiple whitespaces + ''' + stripped = [l.strip() for l in multilinestring.splitlines()] + ret = " ".join (stripped) + return ret + +def d(year, month, day): + ''' + Just a tiny wrapper around datetime.datetime to create a datetime object + ''' + return datetime.date(year, month, day) + + + +CANDIDATES_OPENED = ( + d(*CANDIDATES_OPENED_DATE), + 'Announcements and list of candidates opens', + c("""If you have the team and resources to organize a conference, you may send a nomination to + info@documentfoundation.org with your name, e-mail + address, and a detailed description of your proposal, before + %s (23:59 UTC).""" % d(*CANDIDATES_CLOSED_DATE)) + ''' + ''' + c(""" + You should also send a summary of your candidacy announcement + to discuss@documentfoundation.org. """) + ''' + ''' +) + +CANDIDATES_CLOSED = ( + d(*CANDIDATES_CLOSED_DATE), + 'List of candidates closed', + CANDIDATES_OPENED[2] # Get the same text again +) + +CANDIDATES_ANNOUNCED = ( + d(*CANDIDATES_ANNOUNCED_DATE), + 'List of candidates announced', + 'You may now start to send your questions to the candidates' +) + +VOTING_OPENED = ( + d(*VOTING_OPENED_DATE), + 'Instructions to vote are sent', + 'Please read your email and follow these instructions and submit your vote by %s' % d(*VOTING_CLOSED_DATE) +) +VOTING_CLOSED = ( + d(*VOTING_CLOSED_DATE), + 'Votes must be returned', + 'Preliminary results are announced on %s' % d(*PRELIMINARY_RESULTS_DATE) +) + + +PRELIMINARY_RESULTS = ( + d(*PRELIMINARY_RESULTS_DATE), + 'Preliminary results are announced', + 'The preliminary results can be challenged until %s' % d(*CHALLENGE_CLOSED_DATE) +) + +CHALLENGE_CLOSED = ( + d(*CHALLENGE_CLOSED_DATE), + 'Challenges to the results closed', + "If there weren't any challenges, preliminary results are valid" +) + + + + +def create_ical(eventlist): + '''Generates an ical stream based on the list given as eventlist. + The list shall contain elements with a tuple with a + (date, string, string) object, serving as date when the event takes place, + summary and description respectively. + ''' + log = logging.getLogger('create_ical') + + cal = vobject.iCalendar() + cal.add('method').value = 'PUBLISH' + cal.add('calscale').value = 'GREGORIAN' + cal.add('x-wr-timezone').value = 'UTC' + + for (timestamp, summary, description) in eventlist: + log.debug('creating %s, %s', timestamp, description) + vevent = cal.add('vevent') + vevent.add('dtstart').value = timestamp + vevent.add('dtend').value = timestamp + datetime.timedelta(1) + vevent.add('summary').value = summary + vevent.add('description').value = description + + stream = cal.serialize() + return stream + + +def wraptext(s, width): + '''Wraps a string @s at @width characters. + + >>> wraptext('fooo', 2) + ['fo','oo'] + ''' + l = len(s) + nr_frames = int(math.ceil(float(l)/width)) + print nr_frames + frames = [] + for i in xrange(nr_frames): + start, end = i*width, (i+1) * width + frames.append(s[start:end]) + # One could (and prolly should) yield that + return frames + +def ordinal(n): + n = int(n) + if 10 <= n % 100 < 20: + return str(n) + 'th' + else: + return str(n) + {1 : 'st', 2 : 'nd', 3 : 'rd'}.get(n % 10, "th") + + +def cal_for_month(month, events, width=80, year=datetime.datetime.now().year): + '''Generates a textual calendar for the @month in @year. + It will return a string with the calendar on the left hand side and the + events on the right hand side. + @events shall be a list with tuples: timestamp, summary, description. + + Returns a string with the calendar + ''' + log = logging.getLogger('cal_for_month') + + cal = calendar.TextCalendar() + calstrings = cal.formatmonth(year, month, 3).splitlines() + + for (timestamp, summary, description) in events: + log.debug('creating %s, %s', timestamp, summary) + year, month, day = timestamp.year, timestamp.month, timestamp.day + maxwidth = max([len(cs) for cs in calstrings]) + rightwidth = 80 - maxwidth + for i, line in enumerate(calstrings): + needles = (" %d " % day, + " %d\n" % day) + replacement = "(%d)" % day + # Find the day so that we can highlight it and add a comment + day_in_week = False + for needle in needles: + if needle in line+"\n": + # k, this looks a bit weird but we have that corner + # case with the day being at the end of the line + # which in turn will have been split off + day_in_week = True + break # Set the needle to the found one + if day_in_week == False: # Nothing found, try next week + log.debug('Day (%d) not found in %s', day, line) + continue + else: + log.debug('Day (%d) found in %s', day, line) + new_line = (line+"\n").replace(needle, replacement).rstrip() + new_line += " %s (%s)" % (summary, ordinal(day)) + # Replace in-place for two events in the same week + # FIXME: This has bugs :-( + calstrings[i] = new_line + + return os.linesep.join(calstrings) + +def create_textcal(eventlist): + '''Generates a multiline string containing a calendar with the + events written on the side + The list shall contain elements with a tuple with a + (date, string, string) object, serving as date when the event takes place, + summary and description respectively. + ''' + log = logging.getLogger('textcal') + log.debug('Generating from %s', eventlist) + months = set(map(lambda x: x[0].month, eventlist)) + year = set(map(lambda x: x[0].year, eventlist)).pop() + + final_cal = [] + for month in months: + events = filter(lambda x: x[0].month == month, eventlist) + log.debug('Events for %d: %s', month, events) + month_cal = cal_for_month(month, events, year=year) + final_cal.append(month_cal) + + return os.linesep.join(final_cal) + +if __name__ == "__main__": + from optparse import OptionParser + parser = OptionParser("usage: %prog [options]") + parser.add_option("-l", "--loglevel", dest="loglevel", help="Sets the loglevel to one of debug, info, warn, error, critical", + default=None) + parser.add_option("-i", "--ical", + action="store_true", dest="ical", default=False, + help="print iCal file to stdout") + parser.add_option("-t", "--textcal", + action="store_true", dest="tcal", default=False, + help="print textual calendar to stdout") + (options, args) = parser.parse_args() + + loglevel = {'debug': logging.DEBUG, 'info': logging.INFO, + 'warn': logging.WARNING, 'error': logging.ERROR, + 'critical': logging.CRITICAL}.get(options.loglevel, logging.WARNING) + logging.basicConfig( level=loglevel ) + log = logging.getLogger() + + eventlist = [ + CANDIDATES_OPENED, + CANDIDATES_CLOSED, + CANDIDATES_ANNOUNCED, + VOTING_OPENED, + VOTING_CLOSED, + PRELIMINARY_RESULTS, + CHALLENGE_CLOSED, + ] + + if not any([options.ical, options.tcal]): + parser.error("You want to select either ical or textcal output. See --help for details") + if options.ical: + ical = create_ical( eventlist ) + print ical + if options.tcal: + tcal = create_textcal( eventlist ) + print tcal diff --git a/vote/2013-confpoll/rules.wml b/vote/2013-confpoll/rules.wml new file mode 100644 index 0000000..04c14e8 --- /dev/null +++ b/vote/2013-confpoll/rules.wml @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html> + + <head> + <title>The LibreOffice 2013 conference location poll rules</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + </head> + + <body> + + <h1>Rules & Timeline for the LibreOffice 2013 conference location poll</h1> + + <h2>Poll Rules</h2> + + <ol> + <li> + Members of The Document Foundation as of 2013-01-01 + + are eligible to vote in this poll. Anyone who has made a + contribution to The Document Foundation can apply for membership by completing the + <a href="http://www.documentfoundation.org/foundation/application-for-tdf-community-membership/">application</a>. + Also, your membership needs to be valid at least until the end + of the poll (2013-01-28). + + </li> + <li> + All discussion related to this poll should be held on + <a href="http://listarchives.documentfoundation.org/www/discuss/">discuss@documentfoundation.org</a>. + Members are invited to ask questions to one or all candidates on that + list. + </li> + <li> + Instructions explaining how to vote will be sent via e-mail to all + eligible voters on + 2013-01-14, + + and votes must be returned by 2013-01-28, 23:59 UTC. + </li> + <li> + Votes will be held confidential during this poll, but an + anonymized archive of all submitted votes will be made publicly + accessible at its conclusion. + </li> + <li> + The Document Foundation board of directors is responsible for counting the votes. + </li> + <li> + The poll concludes the 2013 LibreOffice conference location by + simple majority. Every member can vote for exactly one + location. Empty votes are discarded. + </li> + <li> + In the event of a tie, the board will schedule a run-off poll as soon as possible. + </li> + <li> + The board will announce preliminary results as soon as + possible after the poll closes, along with instructions on how to + access the votes archive and how to independently verify the vote + count. + </li> + <li> + Any eligible voter may challenge the preliminary results by e-mailing + <a + href="mailto:info@documentfoundation.org">info@documentfoundation.org</a> + prior to 2013-02-01. + + The decision of the board as to any challenge shall be final. Once all challenges have been + resolved, the board shall announce the final results. + </li> + <li> + Any questions regarding these procedures should be directed to the + board by e-mail to <a + href="mailto:info@documentfoundation.org">info@documentfoundation.org</a>. + The board reserves the right to make any necessary changes or + clarifications to these rules at any point during the poll. + </li> + </ol> + + <h2>Timeline</h2> + <p><small>(all deadlines are 23:59 UTC)</small></p> + <ul> + <li> + 2013-01-15: Announcement of the poll + </li> + <li> + 2013-01-16: Instructions mailed to eligible voters, voting starts. + </li> + <li> + 2013-02-04: Voting closes. + </li> + <li> + 2013-02-05: Preliminary results are announced. + </li> + <li> + 2013-02-08: Last day to challenge preliminary results. + </li> + <li> + 2013-02-09: Announcement of final results. + </li> + </ul> + + </body> +</html> diff --git a/vote/2013-confpoll/timeline.ics b/vote/2013-confpoll/timeline.ics new file mode 100644 index 0000000..543fd7e --- /dev/null +++ b/vote/2013-confpoll/timeline.ics @@ -0,0 +1,67 @@ +BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:20130115T155316Z-54572@thinkpad.bad.example
+DTSTART;VALUE=DATE:20121002
+DTEND;VALUE=DATE:20121003
+DESCRIPTION:If you have the team and resources to organize a conference\,
+ you may send a nomination to info@documentfoundation.org with your name\,
+ e-mail address\, and a detailed description of your proposal\, before 2012
+ -12-16 (23:59 UTC).\n You should also send a summary of your candidacy
+ announcement to discuss@documentfoundation.org.\n
+SUMMARY:Announcements and list of candidates opens
+END:VEVENT
+BEGIN:VEVENT
+UID:20130115T155316Z-16643@thinkpad.bad.example
+DTSTART;VALUE=DATE:20121216
+DTEND;VALUE=DATE:20121217
+DESCRIPTION:If you have the team and resources to organize a conference\,
+ you may send a nomination to info@documentfoundation.org with your name\,
+ e-mail address\, and a detailed description of your proposal\, before 2012
+ -12-16 (23:59 UTC).\n You should also send a summary of your candidacy
+ announcement to discuss@documentfoundation.org.\n
+SUMMARY:List of candidates closed
+END:VEVENT
+BEGIN:VEVENT
+UID:20130115T155316Z-64711@thinkpad.bad.example
+DTSTART;VALUE=DATE:20121217
+DTEND;VALUE=DATE:20121218
+DESCRIPTION:You may now start to send your questions to the candidates
+SUMMARY:List of candidates announced
+END:VEVENT
+BEGIN:VEVENT
+UID:20130115T155316Z-45145@thinkpad.bad.example
+DTSTART;VALUE=DATE:20130116
+DTEND;VALUE=DATE:20130117
+DESCRIPTION:Please read your email and follow these instructions and submi
+ t your vote by 2013-02-04
+SUMMARY:Instructions to vote are sent
+END:VEVENT
+BEGIN:VEVENT
+UID:20130115T155316Z-32146@thinkpad.bad.example
+DTSTART;VALUE=DATE:20130204
+DTEND;VALUE=DATE:20130205
+DESCRIPTION:Preliminary results are announced on 2013-02-05
+SUMMARY:Votes must be returned
+END:VEVENT
+BEGIN:VEVENT
+UID:20130115T155316Z-98493@thinkpad.bad.example
+DTSTART;VALUE=DATE:20130205
+DTEND;VALUE=DATE:20130206
+DESCRIPTION:The preliminary results can be challenged until 2013-02-08
+SUMMARY:Preliminary results are announced
+END:VEVENT
+BEGIN:VEVENT
+UID:20130115T155316Z-65440@thinkpad.bad.example
+DTSTART;VALUE=DATE:20130208
+DTEND;VALUE=DATE:20130209
+DESCRIPTION:If there weren't any challenges\, preliminary results are vali
+ d
+SUMMARY:Challenges to the results closed
+END:VEVENT
+X-WR-TIMEZONE:UTC
+END:VCALENDAR
+ diff --git a/vote/2013-confpoll/voting-instructions.txt b/vote/2013-confpoll/voting-instructions.txt new file mode 100644 index 0000000..d23f6f9 --- /dev/null +++ b/vote/2013-confpoll/voting-instructions.txt @@ -0,0 +1,40 @@ +info@documentfoundation.org +thb@documentfoundation.org +Your LibreOffice 2013 Conference Location Poll Voting Token + +Dear $member, + +The poll for the LibreOffice 2013 conference location will soon be +open. + +Voting will run from 2013-01-16 (Wednesday) until 2013-02-04, 23:59 UTC. + +To vote, please go to + + https://elections.documentfoundation.org/vote.php?election_id=4 + +and follow the instructions there. + +A list of candidates and their statements are available at +https://elections.documentfoundation.org/2013-confpoll/candidates.html + +When instructed to do so, enter the following details: + + E-mail: $email + Vote token: $token + +The election has 4 steps - first, you must identify yourself using the +voting token above. Then select your preferred candidate (you can +choose at most one). A third step will show you your choice, and ask +you to confirm or return to the previous step. Finally, after +confirming your choice, a unique identifier will be given to you which +will allow you to verify after the poll that your vote was counted +correctly. To ensure anonymity, no link will be kept between this +token and your identifiers, so please keep this token safe. Once you +have voted, you will not be able to vote again. + +Thank you for your vote! + +Regards, + Thorsten Behrens + on behalf of The Document Foundation Board of Directors diff --git a/vote/Makefile.am b/vote/Makefile.am index 0cf09df..efc96ce 100644 --- a/vote/Makefile.am +++ b/vote/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = include 2011 2012-confpoll 2012-mc +SUBDIRS = include 2011 2012-confpoll 2012-mc 2013-confpoll urlpath = /vote diff --git a/vote/index.wml b/vote/index.wml index 37a9ef7..f898463 100644 --- a/vote/index.wml +++ b/vote/index.wml @@ -38,6 +38,7 @@ <li><a href="2011/">Material from the 2011 BoD Elections</a></li> <li><a href="2012-confpoll/">Material from the 2012 conference location poll</a></li> <li><a href="2012-mc/">Material from the 2012 Membership Committee Elections</a></li> + <li><a href="2013-confpoll/">Material from the 2013 conference location poll</a></li> </ul> <!-- Do not close the body or html tag because we still add stuff to the footer --> |