function director_data() {
    var dataTable = new google.visualization.DataTable();

    dataTable.addColumn({ type: 'string', id: 'director' });
    dataTable.addColumn({ type: 'string', id: 'bar label' });
    dataTable.addColumn({ type: 'string', role: 'tooltip' });
    dataTable.addColumn({ type: 'date', id: 'start' });
    dataTable.addColumn({ type: 'date', id: 'end' });

    var idNames = {
        ben: 'Ben Laurie',
        bayard: 'Henri Yandell',
        bdelacretaz: 'Bertrand Delacretaz',
        bhyde: 'Ben Hyde',
        brett: 'Brett Porter',
        brian: 'Brian Behlendorf',
        brianm: 'Brian McCallister',
        cdutz: 'Christopher Dutz',
        cliffs: 'Cliff Schmidt',
        clr: 'Craig Russell',
        coar: 'Ken Coar',
        curcuru: 'Shane Curcuru',
        cutting: 'Doug Cutting',
        danny: 'Danny Angus',
        dirkx: 'Dirk-Willem van Gulik',
        dkulp: 'Daniel Kulp',
        dougm: 'Doug Maceachern',
        druggeri: 'Daniel Ruggeri',
        farra: 'J Aaron Farr',
        fielding: 'Roy T. Fielding',
        geirm: 'Geir Magnusson, Jr.',
        gstein: 'Greg Stein',
        isabel: 'Isabel Drost-Fromm',
        jerenkrantz: 'Justin Erenkrantz',
        jim: 'Jim Jagielski',
        jmclean: 'Justin Mclean',
        ke4qqq: 'David Nalley',
        markt: 'Mark Thomas',
        marvin: 'Marvin Humphrey',
        mattmann: 'Chris Mattmann',
        mjc: 'Mark Cox',
        henning: 'Henning Schmiedehausen',
        lrosen: 'Larry Rosen',
        myrle: 'Myrle Krantz',
        niclas: 'Niclas Hedhman',
        ningjiang: 'Willem Ning Jiang',
        noirin: 'Noirin Plunkett',
        pats: 'Patricia Shanahan',
        psteitz: 'Phil Steitz',
        randy: 'Randy Terbush',
        rasmus: 'Rasmus Lerdorf',
        rbowen: 'Rich Bowen',
        rgardler: 'Ross Gardler',
        rubys: 'Sam Ruby',
        sameer: 'Sameer Parekh',
        sharan: 'Sharan Foga',
        stefano: 'Stefano Mazzocchi',
        stoddard: 'Bill Stoddard',
        striker: 'Sander Striker',
        rvs: 'Roman Shaposhnik',
        tdunning: 'Ted Dunning',
        wave: 'Dave Fisher',
        wohali: 'Joan Touzet',
        wrowe: 'William Rowe',
        wusheng: 'Sheng Wu',
    }

    function date(y, m, d) {
        // Date's month is [0..11]
        return new Date(y, m-1, d);
    }

    // NOTE: these are the dates that election results are announced,
    //   which may be two days after the meeting-start (due to
    //   adjournment for voting). Thus, these dates do not necessarily
    //   align with Annual Meeting dates.
    y1999 = date(1999, 3, 13);  // CHECK
    y2000 = date(2000, 3, 11);  // CHECK
    y2001 = date(2001, 4, 3);  // CHECK
    y2002 = date(2002, 5, 21);  // CHECK
    y2003 = date(2003, 6, 18);  // CHECK
    y2004 = date(2004, 5, 18);  // CHECK
    y2005 = date(2005, 5, 24);  // CHECK
    y2006 = date(2006, 6, 13);  // CHECK
    y2007 = date(2007, 6, 5);  // CHECK
    y2008 = date(2008, 6, 3);  // CHECK
    y2009 = date(2009, 7, 9);
    y2010 = date(2010, 7, 15);
    y2011 = date(2011, 7, 14);
    y2012 = date(2012, 5, 24);
    y2013 = date(2013, 5, 23);
    y2014 = date(2014, 5, 29);
    y2015 = date(2015, 3, 26);
    y2016 = date(2016, 3, 24);
    y2017 = date(2017, 3, 30);
    y2018 = date(2018, 3, 22);
    y2019 = date(2019, 3, 28);
    y2020 = date(2020, 4, 2);
    y2021 = date(2021, 3, 9);
    y2022 = date(2022, 3, 1);
    y2023 = date(2023, 3, 9);

    // Transition dates for outgoing/incoming Directors
    // fielding -> striker
    t2004 = date(2004, 1, 21);
    // bayard -> geirm
    t2010 = date(2010, 8, 18);
    // lrosen -> dkulp
    t2012 = date(2012, 3, 21);
    // gstein -> rubys
    t2016a = date(2016, 9, 21);
    // rubys -> rbowen
    t2016b = date(2016, 10, 19);
    // psteitz -> danny
    t2019a = date(2019, 5, 16);
    // jim -> tdunning
    t2019b = date(2019, 5, 16);
    // wohali -> wave
    t2019c = date(2019, 9, 26);

    function add(id, start, end) {
        var name = idNames[id];
        var y1 = start.getFullYear();
        var m1 = start.getMonth();
        var d1 = start.getDate();
        var y2 = end.getFullYear();
        var m2 = end.getMonth();
        var d2 = end.getDate();
        var tip = `${name}, from ${y1}/${m1}/${d1} to ${y2}/${m2}/${2}`;
        dataTable.addRow([id, id, tip, start, end]);
    }

    add('sameer', y1999, y2000);
    add('bhyde', y1999, y2000);
    add('randy', y1999, y2003);
    add('fielding', y1999, t2004);
    add('brian', y1999, y2005);
    add('ben', y1999, y2004);
    add('coar', y1999, y2007);
    add('dirkx', y1999, y2007);
    add('jim', y1999, y2018);
    add('dougm', y2000, y2001);
    add('rasmus', y2000, y2001);
    add('gstein', y2001, t2016a);
    add('stoddard', y2001, y2002);
    add('rubys', y2002, y2009);
    add('mjc', y2003, y2004);
    add('striker', t2004, y2007);
    add('stefano', y2004, y2006);
    add('geirm', y2004, y2005);
    add('ben', y2005, y2006);
    add('jerenkrantz', y2005, y2010);
    add('cliffs', y2006, y2007);
    add('bayard', y2006, y2008);
    add('geirm', y2007, y2010);
    add('farra', y2007, y2009);
    add('wrowe', y2007, y2009);
    add('henning', y2007, y2009);
    add('bdelacretaz', y2008, y2009);
    add('fielding', y2009, y2014);
    add('brett', y2009, y2010);
    add('brianm', y2009, y2010);
    add('cutting', y2009, y2015);
    add('curcuru', y2009, y2012);
    add('bdelacretaz', y2010, y2019);
    add('rubys', y2010, y2016);
    add('bayard', y2010, t2010);
    add('geirm', t2010, y2011);
    add('noirin', y2010, y2011);
    add('brett', y2011, y2019);
    add('lrosen', y2011, t2012);
    add('dkulp', t2012, y2012);
    add('rbowen', y2012, y2013);
    add('rgardler', y2012, y2013);
    add('curcuru', y2013, y2014);
    add('mattmann', y2013, y2018);
    add('rgardler', y2014, y2015);
    add('rbowen', y2014, y2016);
    add('curcuru', y2015, y2021);
    add('ke4qqq', y2015, y2016);
    add('marvin', y2016, y2017);
    add('markt', y2016, y2019);
    add('isabel', y2016, y2017);
    add('rubys', t2016a, t2016b);
    add('rbowen', t2016b, y2020);
    add('tdunning', y2017, y2019);
    add('psteitz', y2017, t2019a);
    add('danny', t2019a, y2020);
    add('isabel', y2018, y2019);
    add('rvs', y2018, y2020);
    add('myrle', y2019, y2020);
    add('druggeri', y2019, y2020);
    add('clr', y2019, y2021);
    add('jim', y2019, t2019b);
    add('tdunning', t2019b, y2020);
    add('wohali', y2019, t2019c);
    add('wave', t2019c, y2020);
    add('bdelacretaz', y2020, y2021);
    add('fielding', y2020, y2021);
    add('niclas', y2020, y2021);
    add('jmclean', y2020, y2021);
    add('rubys', y2020, y2021);
    add('pats', y2020, y2021);
    add('striker', y2020, y2021);

    add('bdelacretaz', y2021, y2022);
    add('fielding', y2021, y2022);
    add('sharan', y2021, y2022);
    add('justin', y2021, y2022);
    add('clr', y2021, y2022);
    add('rubys', y2021, y2022);
    add('rvs', y2021, y2022);
    add('striker', y2021, y2022);
    add('wusheng', y2021, y2022);

    add('rbowen', y2022, y2023);
    add('bdelacretaz', y2022, y2023);
    add('cdutz', y2022, y2023);
    add('fielding', y2022, y2023);
    add('sharan', y2022, y2023);
    add('ningjiang', y2022, y2023);
    add('rubys', y2022, y2023);
    add('rvs', y2022, y2023);
    add('striker', y2022, y2023);

    return dataTable;
}
