{"version":3,"sources":["webpack:///./app/scripts/utils/chart-utils.js","webpack:///./app/scripts/packs/top-counties.js","webpack:///../src/apmonth.js","webpack:///../src/apdate.js","webpack:///../src/utils.js","webpack:///../src/intcomma.js","webpack:///../src/intword.js","webpack:///../src/ordinal.js","webpack:///../src/pluralize.js","webpack:///../src/widont.js","webpack:///./app/scripts/packs/stats.js","webpack:///./app/scripts/components/AsyncComponent.js","webpack:///./config/modern-polyfills.js","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./app/scripts/kickstart.js","webpack:///./app/scripts/packs/main.js","webpack:///./node_modules/classnames/index.js","webpack:///./app/scripts/packs/text-stats.js","webpack:///./app/scripts/packs/statewide-turnout.js","webpack:///./app/scripts/packs/sticky-bar.js","webpack:///./app/scripts/utils/debounce.js","webpack:///./app/scripts/components/Portal.js","webpack:///./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack:///../../src/util.js","webpack:///../../src/index.js","webpack:///./app/scripts/utils/noop.js","webpack:///./app/scripts/components/Typeahead.js","webpack:///./app/scripts/packs/lookup.js","webpack:///./app/scripts/utils/legislative-districts.js","webpack:///./app/scripts/components/PureComponent.js","webpack:///./app/scripts/utils/get-json.js","webpack:///./node_modules/@babel/runtime/helpers/esm/extends.js"],"names":["customDateFormat","d","i","interval","month","moment","format","short_month","day","length","customPercentFormat","apDateFormatMoment","apPercentFormat","number","Math","round","AsyncCountyViewer","asyncComponent","TopCounties","PureComponent","constructor","super","this","state","topCounties","name","fips","render","map","county","key","section","AP_MONTHS","0","1","2","3","4","5","6","7","8","9","10","11","apmonth","date","Date","getMonth","apdate","getDate","getFullYear","isNil","value","_isFinite","isFinite","isInteger","floor","intcomma","val","parts","convertedVal","toString","split","replace","join","SUFFIXES","intword","absConvertedVal","abs","numDigits","ceil","log","LN10","exponent","newVal","pow","AP_ORDINALS","ENGLISH_ORDINAL_EXCEPTIONS","ordinal","spellOutOrdinals","indexOf","pluralize","pluralSuffix","singularSuffix","Array","isArray","Number","widontRegex","RegExp","widont","replaceChar","String","momentDates","Object","keys","data","results","maxDate","latestData","latestCumulativeVotes","county_results","latestCumulativeRegVoters","totalCumulativeRegVoters","parseFloat","totalCumulativeVotes","firstDayEarlyVoting","numberOfDaysResults","diff","top15CumulativeVotes","sort","a","b","registered_voters","slice","c","cumulative_votes_in_person_and_mail","reduce","top10","top10CumulativeVotes","top10totalCumulativeRegVoters","importComponent","PreactComponent","component","componentDidMount","then","setState","m","default","Component","props","require","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","resolve","module","exports","window","ttData","relatedContentContainer","document","getElementById","gutenTag","RelatedContent","title","ribbonContainer","Ribbon","AdLoader","init","hasOwn","hasOwnProperty","classNames","classes","arguments","arg","argType","push","inner","apply","call","numberEarlyVotes","querySelector","percentEarlyVotes","numberEarlyVotesTop10","percentEarlyVotesTop10","textContent","StatewideTurnout","input","isMobile","getElementsByClassName","offsetWidth","selectedItem","sessionStorage","getItem","addEventListener","y","elem","setItem","getBoundingClientRect","top","pageYOffset","scrollTo","behavior","left","IntersectionObserver","target","toggleAttribute","intersectionRatio","threshold","observe","debounce","func","wait","immediate","timeout","args","context","timestamp","result","later","last","now","setTimeout","callNow","Portal","renderPortal","componentWillUnmount","defaultNode","body","removeChild","node","portal","componentDidUpdate","createElement","appendChild","children","_defineProperty","obj","defineProperty","enumerable","configurable","writable","getScroll","w","ret","method","getScrollLeft","getScrollTop","getOffset","el","pos","doc","docElem","x","box","getClientPosition","_RE_NUM_NO_PX","RE_POS","LEFT","each","arr","fn","isBorderBoxFn","getComputedStyleX","computedStyle_","computedStyle","style","rsLeft","BOX_MODELS","swap","options","callback","old","getPBMWidth","which","j","prop","cssProp","isWindow","domUtils","getWH","extra","borderBoxValue","isBorderBox","cssBoxValue","borderBoxValueOrIsBorderBox","padding","refWin","win","documentElementProp","cssShow","position","visibility","display","getWHIgnoreDisplay","css","v","first","includeMargin","getWindow","offset","current","setOffset","clone","scrollLeft","scrollTop","viewportWidth","viewportHeight","container","config","util","allowHorizontalScroll","onlyScrollIfNeeded","alignWithTop","alignWithLeft","offsetTop","offsetLeft","offsetBottom","offsetRight","isWin","elemOffset","eh","ew","wh","ww","winScroll","diffTop","diffBottom","containerScroll","containerOffset","ch","cw","Typeahead","highlightedIndex","isOpen","handleOnBlur","bind","handleOnClear","handleOnFocus","handleOnInput","debouncedHandleOnInput","debounceDuration","handleKeyDown","setInputRef","setMenuRef","setItemRef","listRefs","_","prevState","count","getFilteredItems","Boolean","maybeScrollItemIntoView","element","inputRef","menuRef","idx","itemNode","menuNode","scrollIntoView","items","shouldItemRender","sortItems","filter","item","highlightItemOnMouseEnter","selectItemOnClick","getItemValue","onSelect","blur","renderList","class","ref","onMouseDown","event","preventDefault","cloneElement","renderItem","onClick","onMouseEnter","renderAttribution","onClear","onBlur","inputProps","onFocus","onChange","keyEvents","renderInput","role","autocomplete","onInput","onKeyDown","type","aria-label","aria-hidden","defaultProps","noop","ArrowDown","itemsCount","newIndex","ArrowUp","Enter","keyCode","select","setSelectionRange","Escape","sessionToken","google","maps","places","AutocompleteSessionToken","autocompleteService","AutocompleteService","bounds","east","west","south","north","componentRestrictions","country","types","Lookup","coordinates","lookupError","lookupPending","handleGeocode","debouncedHandleGeocode","placesService","PlacesService","Promise","reject","getPlacePredictions","predict","status","getPredictions","catch","placeId","getDetails","fields","lat","latitude","lng","longitude","geometry","location","toJSON","getJSON","LOOKUP_URL","lookup","addressFeedback","xlinkHref","for","placeholder","description","place_id","isHighlighted","cx","alt","src","shallowEqual","shouldComponentUpdate","jsonResponse","res","ok","statusText","json","fetch","_extends","assign","source","prototype"],"mappings":"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","file":"main.287c5d1926.mjs","sourcesContent":["import * as moment from 'moment';\n\nexport function customDateFormat(d, i, interval) {\n  let month = moment(d).format('MMM'),\n    short_month = moment(d).format('MMMM'),\n    day = moment(d).format('D');\n\n  if (i % interval == 0) {\n    if (short_month.length > 4) return `${month}. ${day}`;\n    else if (short_month.length <= 4) return `${short_month} ${day}`;\n    else return '';\n  }\n}\n\n// export function customDateEmbedFormat(d, startDate, endDate) {\n//   let month = moment(d).format('MMM'),\n//     short_month = moment(d).format('MMMM'),\n//     day = moment(d).format('D');\n\n//   if (moment(d).isSame(startDate) || moment(d).isSame(endDate)) {\n//     if (short_month.length > 4) return `${month}. ${day}`;\n//     else if (short_month.length <= 4) return `${short_month} ${day}`;\n//     else return '';\n//   }\n// }\n\nexport function customPercentFormat(d, i, interval) {\n  if (d === 0 || i % interval == 0) return '';\n  else return `${d}%`;\n}\n\n// format date\nexport function apDateFormatMoment(d) {\n  let month = moment(d).format('MMM'),\n    short_month = moment(d).format('MMMM'),\n    day = moment(d).format('D');\n\n  if (short_month.length > 4) return `${month}. ${day}`;\n  else if (short_month.length <= 4) return `${short_month} ${day}`;\n}\n\n// format percent\nexport function apPercentFormat(number) {\n  let percent = Math.round(number * 1000) / 10;\n  return percent + '%';\n}\n","// packages\nimport { h } from 'preact';\n\n// components\nimport PureComponent from '../components/PureComponent';\nimport asyncComponent from '../components/AsyncComponent';\n\n// county viewer needs to be an async component, because we want it to render after fetching data\nconst AsyncCountyViewer = asyncComponent(() =>\n  import(\n    /* webpackPrefetch: true, webpackChunkName: \"CountyViewer\" */ '../components/CountyViewer'\n  )\n);\n\nclass TopCounties extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = {\n      topCounties: [\n        {\n          name: 'Harris',\n          fips: 48201,\n        },\n        {\n          name: 'Dallas',\n          fips: 48113,\n        },\n        {\n          name: 'Tarrant',\n          fips: 48439,\n        },\n        {\n          name: 'Bexar',\n          fips: 48029,\n        },\n        {\n          name: 'Travis',\n          fips: 48453,\n        },\n        {\n          name: 'Collin',\n          fips: 48085,\n        },\n        {\n          name: 'Denton',\n          fips: 48121,\n        },\n        {\n          name: 'El Paso',\n          fips: 48141,\n        },\n        {\n          name: 'Fort Bend',\n          fips: 48157,\n        },\n        {\n          name: 'Hidalgo',\n          fips: 48215,\n        },\n      ],\n    };\n  }\n\n  render() {\n    const { topCounties } = this.state;\n\n    return (\n      <div>\n        {topCounties.map(county => {\n          return (\n            <AsyncCountyViewer\n              key={county.fips}\n              county={county.name}\n              fips={county.fips}\n              section=\"top-counties\"\n            />\n          );\n        })}\n      </div>\n    );\n  }\n}\n\nexport default TopCounties;\n","/**\n * Map of AP month abbreviations. Note that they are zero-indexed due to\n * JavaScript's life choices. Exported for testing purposes.\n *\n * @private\n * @type {object}\n */\nexport const AP_MONTHS = {\n  0: 'Jan.',\n  1: 'Feb.',\n  2: 'March',\n  3: 'April',\n  4: 'May',\n  5: 'June',\n  6: 'July',\n  7: 'Aug.',\n  8: 'Sept.',\n  9: 'Oct.',\n  10: 'Nov.',\n  11: 'Dec.',\n};\n\n/**\n * Returns an AP-formatted month string that corresponds with the supplied\n * Date. If an `input` is not passed, it will use the result of `new Date();`.\n *\n * @param  {Date} [date] JavaScript Date object, defaults to current date if\n *                       not passed\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // Remember that JavaScript zero-indexes months!\n * journalize.apmonth(new Date(2016, 10, 8));\n * // returns 'Nov.'\n *\n * // Uses the current date if no parameter is passed\n * journalize.apmonth();\n * // returns 'July' (pretend it is actually July)\n */\nexport default function apmonth(date = new Date()) {\n  return AP_MONTHS[date.getMonth()];\n}\n","import apmonth from './apmonth';\n\n/**\n * Returns an AP-formatted date string that corresponds with the supplied\n * Date. If an `input` is not passed, it will use the result of `new Date();`.\n *\n * @param  {Date} [date] JavaScript Date object, defaults to current date if\n *                       not passed\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // Remember that JavaScript zero-indexes months!\n * journalize.apdate(new Date(2016, 10, 8));\n * // returns 'Nov. 8, 2016'\n *\n * // Uses the current date if no parameter is passed\n * journalize.apdate();\n * // returns 'July 4, 2016' (pretend it is actually July 4, 2016)\n */\nexport default function apdate(date = new Date()) {\n  const month = apmonth(date);\n  const dayOfMonth = date.getDate();\n  const year = date.getFullYear();\n\n  return `${month} ${dayOfMonth}, ${year}`;\n}\n","/**\n * Returns true if `value` is null or undefined;\n *\n * @private\n * @param  {*}  value\n * @return {boolean}\n */\nexport function isNil(value) {\n  return value == null;\n}\n\n/**\n * Returns true if `value` is a finite number.\n *\n * Based on: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite\n *\n * @private\n * @param  {*}  value\n * @return {boolean}\n */\nexport function _isFinite(value) {\n  return typeof value === 'number' && isFinite(value);\n}\n\n/**\n * Returns true if `value` is an integer.\n *\n * Based on: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n *\n * @private\n * @param  {*}  value\n * @return {boolean}\n */\nexport function isInteger(value) {\n  return _isFinite(value) && Math.floor(value) === value;\n}\n","import { _isFinite, isNil } from './utils';\n\n/**\n * Converts a number to include commas, if necessary.\n *\n * Source: http://stackoverflow.com/a/2901298\n *\n * @private\n * @param  {number|string} n\n * @return {string}\n */\nfunction numberWithCommas(n) {\n  const parts = n.toString().split('.');\n  parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n  return parts.join('.');\n}\n\n/**\n * Alters a string or number to include commas. If `val` is undefined or null,\n * an empty string is returned.\n *\n * @param  {number|string} val\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.intcomma(10311);\n * // returns '10,311'\n *\n * journalize.intcomma('1234567.1234567');\n * // returns '1,234,567.1234567'\n */\nexport default function intcomma(val) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  const convertedVal = +val;\n\n  // if `convertedVal` is not a number, don't waste time converting it\n  if (!_isFinite(convertedVal)) return val.toString();\n\n  return numberWithCommas(convertedVal);\n}\n","import { isInteger, isNil } from './utils';\n\n/**\n * Array of suffixes to be used by intword.\n * @private\n * @type {string[]}\n */\nconst SUFFIXES = [\n  'million',\n  'billion',\n  'trillion',\n  'quadrillion',\n  'quintillion',\n  'sextillion',\n  'septillion',\n  'octillion',\n  'nonillion',\n  'decillion',\n];\n\n/**\n * Returns the number of digits found in a number. Accounts for exponents, too.\n *\n * @private\n * @param  {number} n\n * @return {number}\n */\nfunction getLengthOfNumber(n) {\n  return Math.ceil(Math.log(n + 1) / Math.LN10);\n}\n\n/**\n * Converts a large integer into a string representation. Only makes sense for\n * numbers at least 1 million or more.\n *\n * @param  {number|string} val\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.intword(1000000);\n * // returns '1 million'\n *\n * journalize.intword(6500000000000);\n * // returns '6.5 trillion'\n */\nexport default function intword(val) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  const convertedVal = +val;\n\n  // if `convertedVal` is not an integer, return `val`\n  if (!isInteger(convertedVal)) return val.toString();\n\n  // get the absolute value to de-sign it\n  const absConvertedVal = Math.abs(convertedVal);\n\n  // if `convertedVal` is less than 1 million, no conversion is needed\n  if (absConvertedVal < 1000000) return val.toString();\n\n  // get the number of digits in the number, and substract remainder to get\n  // exponent value\n  const numDigits = getLengthOfNumber(absConvertedVal) - 1;\n  const exponent = numDigits - (numDigits % 3);\n\n  // calculate the rounded version of `convertedVal`\n  let newVal = convertedVal / Math.pow(10, exponent);\n  newVal = Math.round(newVal * 10) / 10;\n\n  return newVal + ' ' + SUFFIXES[Math.floor(exponent / 3) - 2];\n}\n","import { isInteger, isNil } from './utils';\n\n/**\n * A list of suffixes for conversions.\n * @private\n * @type {string[]}\n */\nconst SUFFIXES = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];\n\n/**\n * List of spelled out ordinals per AP style.\n * @private\n * @type {string[]}\n */\nconst AP_ORDINALS = [\n  'first',\n  'second',\n  'third',\n  'fourth',\n  'fifth',\n  'sixth',\n  'seventh',\n  'eighth',\n  'ninth',\n];\n\n/**\n * A list of funky English ordinals.\n * @private\n * @type {number[]}\n */\nconst ENGLISH_ORDINAL_EXCEPTIONS = [11, 12, 13];\n\n/**\n * Converts an integer into its ordinal form. If `spellOutOrdinals` is `true`,\n * 1 through 9 will be spelled out per AP style. Handles the special cases of\n * 11, 12 and 13, too. If a non-integer is submitted it will be returned in\n * its original form.\n *\n * @param  {number|string} val\n * @param {boolean} [spellOutOrdinals]\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.ordinal(5);\n * // returns '5th'\n *\n * journalize.ordinal(13);\n * // returns '13th'\n *\n * journalize.ordinal(103);\n * // returns '103rd'\n *\n * journalize.ordinal(7, true);\n * // returns 'seventh'\n */\nexport default function ordinal(val, spellOutOrdinals = false) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  const convertedVal = +val;\n\n  // if `convertedVal` is not an integer, return `val`\n  if (!isInteger(convertedVal)) return val.toString();\n\n  // if `spellOutOrdinals` is true, return the spelled out versions of 1-9\n  if (spellOutOrdinals && convertedVal < 10) {\n    return AP_ORDINALS[convertedVal - 1];\n  }\n\n  // if `convertedVal` is 11, 12 or 13, English gets weird\n  if (ENGLISH_ORDINAL_EXCEPTIONS.indexOf(convertedVal % 100) > -1) {\n    return convertedVal + SUFFIXES[0];\n  }\n\n  return convertedVal + SUFFIXES[convertedVal % 10];\n}\n","/**\n * Returns a plural suffix if the value is not 1. By default, `pluralize`\n * uses \"s\" as the suffix. If a `String` is provided, `pluralize` will attempt\n * to convert it into a `Number`. If an `Array` is provided instead of a\n * number, the length of the `Array` is used to determine the suffix. An\n * alternative plural suffix can be provided as the second parameter, and if\n * necessary, an alternative singular suffix can be provided as the third.\n *\n * @param {number|string|array} value\n * @param {string} [pluralSuffix='s']\n * @param {string} [singularSuffix='']\n * @return {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * // typical usage\n * 'vote' + journalize.pluralize(0); // votes\n * 'vote' + journalize.pluralize(1); // vote\n * 'vote' + journalize.pluralize(2); // votes\n *\n * // the plural suffix may be changed\n * 'class' + journalize.pluralize(0, 'es'); // classes\n * 'class' + journalize.pluralize(1, 'es'); // class\n * 'class' + journalize.pluralize(2, 'es'); // classes\n *\n * // some words also need a custom singular suffix\n * 'cand' + journalize.pluralize(0, 'ies', 'y'); // candies\n * 'cand' + journalize.pluralize(1, 'ies', 'y'); // candy\n * 'cand' + journalize.pluralize(2, 'ies', 'y'); // candies\n */\nexport default function pluralize(\n  value,\n  pluralSuffix = 's',\n  singularSuffix = ''\n) {\n  // if this is an array, base the return value on the length\n  if (Array.isArray(value)) {\n    if (value.length !== 1) {\n      return pluralSuffix;\n    } else {\n      return singularSuffix;\n    }\n  }\n\n  // otherwise we have a string or number - convert it and test if its 1\n  if (Number(value) !== 1) {\n    return pluralSuffix;\n  }\n\n  return singularSuffix;\n}\n","import { isNil } from './utils';\n\n/**\n * The non-breaking space character added to the string passed to widont.\n * Exported for testing purposes.\n *\n * @private\n * @type {string}\n */\nexport const nbsp = '\\xA0';\n\n/**\n * The regular expression to find the final space in a string for widont.\n *\n * @private\n * @type {RegExp}\n */\nconst widontRegex = new RegExp(/\\s+([^\\s]*)\\s*$/);\n\n/**\n * Prevents \"widows\" - a word by itself on a line - from appearing in strings\n * by replacing the space between the last two words with a non-breaking space\n * character.\n *\n * @param {string} val\n * @param {string} [replaceChar='\\xA0'] The character to replace the space with\n * @returns {string}\n * @example\n *\n * var journalize = require('journalize');\n *\n * journalize.widont('this is a string');\n * // returns 'this is a&nbsp;string'\n *\n * journalize.widont('this is a string', 'HELLO');\n * // returns 'this is aHELLOstring'\n *\n */\nexport default function widont(val, replaceChar = nbsp) {\n  // if `val` is undefined or null, return an empty string\n  if (isNil(val)) return '';\n\n  // coerce value to a String\n  const str = String(val);\n\n  return str.replace(widontRegex, `${replaceChar}$1`);\n}\n","import * as moment from 'moment';\nimport data from '../../../data/early_voting_data.json';\n// import countyHistorical from '../../../data/counties.json';\n\n// get latest date\nlet momentDates = Object.keys(data[0].results).map(d => moment(d)),\n  maxDate = moment.max(momentDates);\n\n// latest cumulative data\nlet latestData = data[0].results[maxDate.format('YYYY-MM-DD HH:mm:ss.S')],\n  latestCumulativeVotes =\n    latestData.county_results['TOTAL']['cumulative_votes_in_person_and_mail'],\n  latestCumulativeRegVoters =\n    latestData.county_results['TOTAL']['registered_voters'];\n\n// cumulative registered voters across parties\nlet totalCumulativeRegVoters = parseFloat(\n  latestCumulativeRegVoters.replace(/,/g, '')\n);\n\n// cumulative votes across parties\nlet totalCumulativeVotes = parseFloat(latestCumulativeVotes.replace(/,/g, ''));\n\n// first day of early voting + how many days of results we have\nlet firstDayEarlyVoting = moment.min(momentDates),\n  numberOfDaysResults = maxDate.diff(firstDayEarlyVoting, 'days') + 1;\n\n// get top 15 counties with the most registered voters from this year's data\nlet top15Counties = Object.keys(latestData.county_results)\n  .sort(function(a, b) {\n    return (\n      latestData.county_results[b].registered_voters -\n      latestData.county_results[a].registered_voters\n    );\n  })\n  .slice(0, 15);\n\n// get top 15's latest data\nlet top15 = top15Counties.map(c => latestData.county_results[c]),\n  top15CumulativeVotes = top15 // get total votes from the top 15 counties\n    .map(d =>\n      parseFloat(d.cumulative_votes_in_person_and_mail.replace(/,/g, ''))\n    )\n    .reduce((a, b) => a + b, 0);\n\n// get top 10 counties with the most registered voters from this year's data\nlet top10Counties = Object.keys(latestData.county_results)\n  .sort(function(a, b) {\n    return (\n      latestData.county_results[b].registered_voters -\n      latestData.county_results[a].registered_voters\n    );\n  })\n  .slice(0, 10);\n\n// get top 10's latest data\nlet top10 = top10Counties.map(c => latestData.county_results[c]),\n  top10CumulativeVotes = top10 // get total votes from the top 10 counties\n    .map(d =>\n      parseFloat(d.cumulative_votes_in_person_and_mail.replace(/,/g, ''))\n    )\n    .reduce((a, b) => a + b, 0),\n  top10totalCumulativeRegVoters = top10 // get total registered voters from the top 10 counties\n    .map(d => parseFloat(d.registered_voters.replace(/,/g, '')))\n    .reduce((a, b) => a + b, 0);\n\n// // get top 15's historical data\n// let top15Historical = countyHistorical[`day_${numberOfDaysResults}`].filter(c =>\n//   top15Counties.includes(c.name.toUpperCase())\n// );\n\n// // get top 15's 2016 and 2012 data\n// let top15CumulativeVotes2016 = top15Historical.reduce((a, b) => {\n//   if (!b['2016_votes_dem'] || b['2016_votes_dem'] == '') {\n//     return a + 0;\n//   } else {\n//     return a + b['2016_votes_dem'];\n//   }\n// }, 0);\n\n// let top15CumulativeVotes2012 = top15Historical.reduce((a, b) => {\n//   if (!b['2012_votes_dem'] || b['2012_votes_dem'] == '') {\n//     return a + 0;\n//   } else {\n//     return a + b['2012_votes_dem'];\n//   }\n// }, 0);\n\nexport {\n  maxDate,\n  latestCumulativeVotes,\n  totalCumulativeVotes,\n  totalCumulativeRegVoters,\n  numberOfDaysResults,\n  firstDayEarlyVoting,\n  top15CumulativeVotes,\n  top10CumulativeVotes,\n  top10totalCumulativeRegVoters,\n  // top15CumulativeVotes2016,\n  // top15CumulativeVotes2012,\n};\n","import { Component as PreactComponent, h } from 'preact';\n\nfunction resolve(m) {\n  return m && m.default ? m.default : m;\n}\n\nfunction asyncComponent(importComponent) {\n  return class extends PreactComponent {\n    constructor() {\n      super();\n\n      this.state = { component: null };\n    }\n\n    componentDidMount() {\n      importComponent().then(component =>\n        this.setState({ component: resolve(component) })\n      );\n    }\n\n    render() {\n      const { component: Component } = this.state;\n\n      return Component ? <Component {...this.props} /> : null;\n    }\n  };\n}\n\nexport default asyncComponent;\n","'use strict';\n\n// We depend on intersection-observer enough that it should just be assumed as necessary\nrequire('intersection-observer');\n","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-in\": \"7C5Q\",\n\t\"./en-in.js\": \"7C5Q\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./en-sg\": \"t+mt\",\n\t\"./en-sg.js\": \"t+mt\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fil\": \"1ppg\",\n\t\"./fil.js\": \"1ppg\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-deva\": \"qvJo\",\n\t\"./gom-deva.js\": \"qvJo\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./oc-lnc\": \"Fnuy\",\n\t\"./oc-lnc.js\": \"Fnuy\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tk\": \"Wv91\",\n\t\"./tk.js\": \"Wv91\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-mo\": \"OmwH\",\n\t\"./zh-mo.js\": \"OmwH\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","import { h, render } from 'preact';\n\n// just in case this gets removed\nwindow.ttData = window.ttData || {};\n\n// related content\nconst relatedContentContainer = document.getElementById(\n  'related-content-container'\n);\n\nif (relatedContentContainer && window.ttData.gutenTag) {\n  import(\n    /* webpackChunkName: \"RelatedContent\" */ './components/RelatedContent'\n  ).then(({ default: RelatedContent }) =>\n    render(\n      <RelatedContent title={'Read more'} gutenTag={window.ttData.gutenTag} />,\n      relatedContentContainer\n    )\n  );\n}\n\n// trending ribbon\nconst ribbonContainer = document.getElementById('ribbon-container');\n\nif (ribbonContainer) {\n  import(\n    /* webpackChunkName: \"Ribbon\" */ './components/Ribbon'\n  ).then(({ default: Ribbon }) => render(<Ribbon />, ribbonContainer));\n}\n\n// ads\nimport(/* webpackChunkName: \"ads\" */ './utils/ad-loader').then(\n  ({ default: AdLoader }) => {\n    const ads = new AdLoader();\n    ads.init();\n  }\n);\n","// import JS files\nimport { h, render } from 'preact';\nimport '../kickstart';\nimport './text-stats';\nimport './sticky-bar';\n// import './countdown';\nimport StatewideTurnout from './statewide-turnout';\nimport Lookup from './lookup';\nimport TopCounties from './top-counties';\n\nrender(<StatewideTurnout />, document.getElementById('statewide-turnout'));\nrender(<Lookup />, document.getElementById('lookup'));\nrender(<TopCounties />, document.getElementById('top-counties'));\n","/*!\n  Copyright (c) 2017 Jed Watson.\n  Licensed under the MIT License (MIT), see\n  http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import {\n  firstDayEarlyVoting,\n  totalCumulativeVotes,\n  totalCumulativeRegVoters,\n  numberOfDaysResults,\n  top10CumulativeVotes,\n  top10totalCumulativeRegVoters,\n} from './stats';\nimport { intcomma, ordinal } from 'journalize';\nimport { apPercentFormat, apDateFormatMoment } from '../utils/chart-utils';\n\n// get the slots\n// let earlyVotingDate = document.querySelector('#early-voting-date'),\n// dayEarlyVoting = document.querySelector('#day-of-early-voting'),\nlet numberEarlyVotes = document.querySelector('#number-early-votes'),\n  percentEarlyVotes = document.querySelector('#percent-early-votes'),\n  numberEarlyVotesTop10 = document.querySelector('#number-early-votes-top-10'),\n  percentEarlyVotesTop10 = document.querySelector(\n    '#percent-early-votes-top-10'\n  );\n\n// earlyVotingDate.textContent = apDateFormatMoment(\n//   new Date(firstDayEarlyVoting.clone().add(numberOfDaysResults - 1, 'days'))\n// );\n\n// set day of early voting\nlet ordinalDay = [\n  'first',\n  'second',\n  'third',\n  'fourth',\n  'fifth',\n  'sixth',\n  'seventh',\n  'eighth',\n  'ninth',\n];\n\n// if (numberOfDaysResults <= ordinalDay.length)\n//   dayEarlyVoting.textContent = ordinalDay[numberOfDaysResults - 1];\n// else dayEarlyVoting.textContent = ordinal(numberOfDaysResults);\n\n// set number of early votes\n// COMMENT THIS OUT FOR TOP 10 VERSION\nnumberEarlyVotes.textContent = intcomma(totalCumulativeVotes);\n\n// set percent of votes\n// COMMENT THIS OUT FOR TOP 10 VERSION\npercentEarlyVotes.textContent = apPercentFormat(\n  totalCumulativeVotes / totalCumulativeRegVoters\n);\n\n// set the number of votes from the top 10 counties as of day\nnumberEarlyVotesTop10.textContent = intcomma(top10CumulativeVotes);\n\npercentEarlyVotesTop10.textContent = apPercentFormat(\n  top10CumulativeVotes / top10totalCumulativeRegVoters\n);\n\n// let numberEarlyVotesTop15 = document.querySelector('#number-early-votes-top-15');\n\n// let fraction2016EV = document.querySelector('#fraction-early-votes-2016'),\n// fraction2012EV = document.querySelector('#fraction-early-votes-2012'),\n// dayEarlyVoting2016 = document.querySelector('#day-of-early-voting-2016');\n\n// dayEarlyVoting2016.textContent = numberOfDaysResults;\n\n// set the number of votes from the top 15 counties as of day\n// numberEarlyVotesTop15.textContent = intcomma(top15CumulativeVotes);\n\n// // set fraction of 2016 as of the day\n// fraction2016EV.textContent = apPercentFormat(\n//   top15CumulativeVotes / top15CumulativeVotes2016\n// );\n\n// // set fraction of 2012 as of the day\n// fraction2012EV.textContent = apPercentFormat(\n//   top15CumulativeVotes / top15CumulativeVotes2012\n// );\n","// packages\nimport { h } from 'preact';\n\n// components\nimport PureComponent from '../components/PureComponent';\nimport asyncComponent from '../components/AsyncComponent';\n\n// county viewer needs to be an async component, because we want it to render after fetching data\nconst AsyncCountyViewer = asyncComponent(() =>\n  import(\n    /* webpackPrefetch: true, webpackChunkName: \"CountyViewer\" */ '../components/CountyViewer'\n  )\n);\n\nclass StatewideTurnout extends PureComponent {\n  constructor() {\n    super();\n  }\n\n  render() {\n    return (\n      <div>\n        <AsyncCountyViewer county=\"Total\" section=\"statewide\" />\n      </div>\n    );\n  }\n}\n\nexport default StatewideTurnout;\n","/* The top sticky bar */\nlet input = document.querySelector('#select-county');\n\nlet MOBILE_THRESHOLD = 544;\n\nlet containerWidth = document.getElementsByClassName('results-container')\n  .offsetWidth;\n\nlet isMobile = containerWidth <= MOBILE_THRESHOLD ? true : false;\n\nvar selectedItem = sessionStorage.getItem('SelectedItem');\nif (selectedItem) {\n  document.getElementById('select-county').value = selectedItem;\n}\n\ninput.addEventListener('change', function() {\n  const elem = document.getElementById(this.value);\n  sessionStorage.setItem('SelectedItem', this.value);\n\n  scrollIt(elem);\n});\n\nfunction scrollIt(element) {\n  const y =\n    element.getBoundingClientRect().top +\n    window.pageYOffset -\n    (isMobile ? 115 : 75);\n\n  window.scrollTo({\n    behavior: 'smooth',\n    left: 0,\n    top: y,\n  });\n}\n\n// Added a function to tell when the sticky bar is stuck so that we can hide the \"See who's running for:\" for mobile.\nconst observer = new IntersectionObserver(\n  ([e]) => e.target.toggleAttribute('stuck', e.intersectionRatio < 1),\n  { threshold: [1] }\n);\n\nobserver.observe(document.querySelector('#sticky-bar'));\n","export default function debounce(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n\n  var later = function() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      }\n    }\n  };\n\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n}\n","import { Component, render } from 'preact';\n\nclass Portal extends Component {\n  componentDidMount() {\n    this.renderPortal();\n  }\n\n  componentWillUnmount() {\n    if (this.defaultNode) {\n      document.body.removeChild(this.defaultNode);\n    } else {\n      // Unmount the children rendered in custom node\n      render(null, this.props.node, this.portal);\n    }\n\n    this.defaultNode = null;\n    this.portal = null;\n  }\n\n  componentDidUpdate() {\n    this.renderPortal();\n  }\n\n  renderPortal() {\n    if (!this.props.node && !this.defaultNode) {\n      this.defaultNode = document.createElement('div');\n      document.body.appendChild(this.defaultNode);\n    }\n\n    const children = this.props.children;\n\n    this.portal = render(\n      (children && children[0]) || null,\n      this.props.node || this.defaultNode,\n      this.portal\n    );\n  }\n\n  render() {\n    return null;\n  }\n}\n\nexport default Portal;\n","export default function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}","const RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\n\nfunction getClientPosition(elem) {\n  let box;\n  let x;\n  let y;\n  const doc = elem.ownerDocument;\n  const body = doc.body;\n  const docElem = doc && doc.documentElement;\n  // 根据 GBS 最新数据，A-Grade Browsers 都已支持 getBoundingClientRect 方法，不用再考虑传统的实现方式\n  box = elem.getBoundingClientRect();\n\n  // 注：jQuery 还考虑减去 docElem.clientLeft/clientTop\n  // 但测试发现，这样反而会导致当 html 和 body 有边距/边框样式时，获取的值不正确\n  // 此外，ie6 会忽略 html 的 margin 值，幸运地是没有谁会去设置 html 的 margin\n\n  x = box.left;\n  y = box.top;\n\n  // In IE, most of the time, 2 extra pixels are added to the top and left\n  // due to the implicit 2-pixel inset border.  In IE6/7 quirks mode and\n  // IE6 standards mode, this border can be overridden by setting the\n  // document element's border to zero -- thus, we cannot rely on the\n  // offset always being 2 pixels.\n\n  // In quirks mode, the offset can be determined by querying the body's\n  // clientLeft/clientTop, but in standards mode, it is found by querying\n  // the document element's clientLeft/clientTop.  Since we already called\n  // getClientBoundingRect we have already forced a reflow, so it is not\n  // too expensive just to query them all.\n\n  // ie 下应该减去窗口的边框吧，毕竟默认 absolute 都是相对窗口定位的\n  // 窗口边框标准是设 documentElement ,quirks 时设置 body\n  // 最好禁止在 body 和 html 上边框 ，但 ie < 9 html 默认有 2px ，减去\n  // 但是非 ie 不可能设置窗口边框，body html 也不是窗口 ,ie 可以通过 html,body 设置\n  // 标准 ie 下 docElem.clientTop 就是 border-top\n  // ie7 html 即窗口边框改变不了。永远为 2\n  // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框，即使设了 border-top 也为 0\n\n  x -= docElem.clientLeft || body.clientLeft || 0;\n  y -= docElem.clientTop || body.clientTop || 0;\n\n  return {\n    left: x,\n    top: y,\n  };\n}\n\nfunction getScroll(w, top) {\n  let ret = w[`page${top ? 'Y' : 'X'}Offset`];\n  const method = `scroll${top ? 'Top' : 'Left'}`;\n  if (typeof ret !== 'number') {\n    const d = w.document;\n    // ie6,7,8 standard mode\n    ret = d.documentElement[method];\n    if (typeof ret !== 'number') {\n      // quirks mode\n      ret = d.body[method];\n    }\n  }\n  return ret;\n}\n\nfunction getScrollLeft(w) {\n  return getScroll(w);\n}\n\nfunction getScrollTop(w) {\n  return getScroll(w, true);\n}\n\nfunction getOffset(el) {\n  const pos = getClientPosition(el);\n  const doc = el.ownerDocument;\n  const w = doc.defaultView || doc.parentWindow;\n  pos.left += getScrollLeft(w);\n  pos.top += getScrollTop(w);\n  return pos;\n}\nfunction _getComputedStyle(elem, name, computedStyle_) {\n  let val = '';\n  const d = elem.ownerDocument;\n  const computedStyle =\n    computedStyle_ || d.defaultView.getComputedStyle(elem, null);\n\n  // https://github.com/kissyteam/kissy/issues/61\n  if (computedStyle) {\n    val = computedStyle.getPropertyValue(name) || computedStyle[name];\n  }\n\n  return val;\n}\n\nconst _RE_NUM_NO_PX = new RegExp(`^(${RE_NUM})(?!px)[a-z%]+$`, 'i');\nconst RE_POS = /^(top|right|bottom|left)$/;\nconst CURRENT_STYLE = 'currentStyle';\nconst RUNTIME_STYLE = 'runtimeStyle';\nconst LEFT = 'left';\nconst PX = 'px';\n\nfunction _getComputedStyleIE(elem, name) {\n  // currentStyle maybe null\n  // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n  let ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n  // 当 width/height 设置为百分比时，通过 pixelLeft 方式转换的 width/height 值\n  // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n  // 在 ie 下不对，需要直接用 offset 方式\n  // borderWidth 等值也有问题，但考虑到 borderWidth 设为百分比的概率很小，这里就不考虑了\n\n  // From the awesome hack by Dean Edwards\n  // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n  // If we're not dealing with a regular pixel number\n  // but a number that has a weird ending, we need to convert it to pixels\n  // exclude left right for relativity\n  if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n    // Remember the original values\n    const style = elem.style;\n    const left = style[LEFT];\n    const rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n    // prevent flashing of content\n    elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n    // Put in the new values to get a computed value out\n    style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n    ret = style.pixelLeft + PX;\n\n    // Revert the changed values\n    style[LEFT] = left;\n\n    elem[RUNTIME_STYLE][LEFT] = rsLeft;\n  }\n  return ret === '' ? 'auto' : ret;\n}\n\nlet getComputedStyleX;\nif (typeof window !== 'undefined') {\n  getComputedStyleX = window.getComputedStyle\n    ? _getComputedStyle\n    : _getComputedStyleIE;\n}\n\nfunction each(arr, fn) {\n  for (let i = 0; i < arr.length; i++) {\n    fn(arr[i]);\n  }\n}\n\nfunction isBorderBoxFn(elem) {\n  return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\n\nconst BOX_MODELS = ['margin', 'border', 'padding'];\nconst CONTENT_INDEX = -1;\nconst PADDING_INDEX = 2;\nconst BORDER_INDEX = 1;\nconst MARGIN_INDEX = 0;\n\nfunction swap(elem, options, callback) {\n  const old = {};\n  const style = elem.style;\n  let name;\n\n  // Remember the old values, and insert the new ones\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      old[name] = style[name];\n      style[name] = options[name];\n    }\n  }\n\n  callback.call(elem);\n\n  // Revert the old values\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      style[name] = old[name];\n    }\n  }\n}\n\nfunction getPBMWidth(elem, props, which) {\n  let value = 0;\n  let prop;\n  let j;\n  let i;\n  for (j = 0; j < props.length; j++) {\n    prop = props[j];\n    if (prop) {\n      for (i = 0; i < which.length; i++) {\n        let cssProp;\n        if (prop === 'border') {\n          cssProp = `${prop + which[i]}Width`;\n        } else {\n          cssProp = prop + which[i];\n        }\n        value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n      }\n    }\n  }\n  return value;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n  // must use == for ie8\n  /* eslint eqeqeq:0 */\n  return obj != null && obj == obj.window;\n}\n\nconst domUtils = {};\n\neach(['Width', 'Height'], name => {\n  domUtils[`doc${name}`] = refWin => {\n    const d = refWin.document;\n    return Math.max(\n      // firefox chrome documentElement.scrollHeight< body.scrollHeight\n      // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n      d.documentElement[`scroll${name}`],\n      // quirks : documentElement.scrollHeight 最大等于可视窗口多一点？\n      d.body[`scroll${name}`],\n      domUtils[`viewport${name}`](d),\n    );\n  };\n\n  domUtils[`viewport${name}`] = win => {\n    // pc browser includes scrollbar in window.innerWidth\n    const prop = `client${name}`;\n    const doc = win.document;\n    const body = doc.body;\n    const documentElement = doc.documentElement;\n    const documentElementProp = documentElement[prop];\n    // 标准模式取 documentElement\n    // backcompat 取 body\n    return (\n      (doc.compatMode === 'CSS1Compat' && documentElementProp) ||\n      (body && body[prop]) ||\n      documentElementProp\n    );\n  };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra]  'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, extra) {\n  if (isWindow(elem)) {\n    return name === 'width'\n      ? domUtils.viewportWidth(elem)\n      : domUtils.viewportHeight(elem);\n  } else if (elem.nodeType === 9) {\n    return name === 'width'\n      ? domUtils.docWidth(elem)\n      : domUtils.docHeight(elem);\n  }\n  const which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n  let borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;\n  const computedStyle = getComputedStyleX(elem);\n  const isBorderBox = isBorderBoxFn(elem, computedStyle);\n  let cssBoxValue = 0;\n  if (borderBoxValue == null || borderBoxValue <= 0) {\n    borderBoxValue = undefined;\n    // Fall back to computed then un computed css if necessary\n    cssBoxValue = getComputedStyleX(elem, name);\n    if (cssBoxValue == null || Number(cssBoxValue) < 0) {\n      cssBoxValue = elem.style[name] || 0;\n    }\n    // Normalize '', auto, and prepare for extra\n    cssBoxValue = parseFloat(cssBoxValue) || 0;\n  }\n  if (extra === undefined) {\n    extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n  }\n  const borderBoxValueOrIsBorderBox =\n    borderBoxValue !== undefined || isBorderBox;\n  const val = borderBoxValue || cssBoxValue;\n  if (extra === CONTENT_INDEX) {\n    if (borderBoxValueOrIsBorderBox) {\n      return (\n        val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle)\n      );\n    }\n    return cssBoxValue;\n  }\n  if (borderBoxValueOrIsBorderBox) {\n    const padding =\n      extra === PADDING_INDEX\n        ? -getPBMWidth(elem, ['border'], which, computedStyle)\n        : getPBMWidth(elem, ['margin'], which, computedStyle);\n    return val + (extra === BORDER_INDEX ? 0 : padding);\n  }\n  return (\n    cssBoxValue +\n    getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle)\n  );\n}\n\nconst cssShow = {\n  position: 'absolute',\n  visibility: 'hidden',\n  display: 'block',\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay(elem) {\n  let val;\n  const args = arguments;\n  // in case elem is window\n  // elem.offsetWidth === undefined\n  if (elem.offsetWidth !== 0) {\n    val = getWH.apply(undefined, args);\n  } else {\n    swap(elem, cssShow, () => {\n      val = getWH.apply(undefined, args);\n    });\n  }\n  return val;\n}\n\nfunction css(el, name, v) {\n  let value = v;\n  if (typeof name === 'object') {\n    for (const i in name) {\n      if (name.hasOwnProperty(i)) {\n        css(el, i, name[i]);\n      }\n    }\n    return undefined;\n  }\n  if (typeof value !== 'undefined') {\n    if (typeof value === 'number') {\n      value += 'px';\n    }\n    el.style[name] = value;\n    return undefined;\n  }\n  return getComputedStyleX(el, name);\n}\n\neach(['width', 'height'], name => {\n  const first = name.charAt(0).toUpperCase() + name.slice(1);\n  domUtils[`outer${first}`] = (el, includeMargin) => {\n    return (\n      el &&\n      getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX)\n    );\n  };\n  const which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n\n  domUtils[name] = (elem, val) => {\n    if (val !== undefined) {\n      if (elem) {\n        const computedStyle = getComputedStyleX(elem);\n        const isBorderBox = isBorderBoxFn(elem);\n        if (isBorderBox) {\n          val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);\n        }\n        return css(elem, name, val);\n      }\n      return undefined;\n    }\n    return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n  };\n});\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setOffset(elem, offset) {\n  // set position first, in-case top/left are set even on static elem\n  if (css(elem, 'position') === 'static') {\n    elem.style.position = 'relative';\n  }\n\n  const old = getOffset(elem);\n  const ret = {};\n  let current;\n  let key;\n\n  for (key in offset) {\n    if (offset.hasOwnProperty(key)) {\n      current = parseFloat(css(elem, key)) || 0;\n      ret[key] = current + offset[key] - old[key];\n    }\n  }\n  css(elem, ret);\n}\n\nexport default {\n  getWindow(node) {\n    const doc = node.ownerDocument || node;\n    return doc.defaultView || doc.parentWindow;\n  },\n  offset(el, value) {\n    if (typeof value !== 'undefined') {\n      setOffset(el, value);\n    } else {\n      return getOffset(el);\n    }\n  },\n  isWindow,\n  each,\n  css,\n  clone(obj) {\n    const ret = {};\n    for (const i in obj) {\n      if (obj.hasOwnProperty(i)) {\n        ret[i] = obj[i];\n      }\n    }\n    const overflow = obj.overflow;\n    if (overflow) {\n      for (const i in obj) {\n        if (obj.hasOwnProperty(i)) {\n          ret.overflow[i] = obj.overflow[i];\n        }\n      }\n    }\n    return ret;\n  },\n  scrollLeft(w, v) {\n    if (isWindow(w)) {\n      if (v === undefined) {\n        return getScrollLeft(w);\n      }\n      window.scrollTo(v, getScrollTop(w));\n    } else {\n      if (v === undefined) {\n        return w.scrollLeft;\n      }\n      w.scrollLeft = v;\n    }\n  },\n  scrollTop(w, v) {\n    if (isWindow(w)) {\n      if (v === undefined) {\n        return getScrollTop(w);\n      }\n      window.scrollTo(getScrollLeft(w), v);\n    } else {\n      if (v === undefined) {\n        return w.scrollTop;\n      }\n      w.scrollTop = v;\n    }\n  },\n  viewportWidth: 0,\n  viewportHeight: 0,\n  ...domUtils,\n};\n","import util from './util';\n\nfunction scrollIntoView(elem, container, config) {\n  config = config || {};\n  // document 归一化到 window\n  if (container.nodeType === 9) {\n    container = util.getWindow(container);\n  }\n\n  let allowHorizontalScroll = config.allowHorizontalScroll;\n  const onlyScrollIfNeeded = config.onlyScrollIfNeeded;\n  let alignWithTop = config.alignWithTop;\n  let alignWithLeft = config.alignWithLeft;\n  const offsetTop = config.offsetTop || 0;\n  const offsetLeft = config.offsetLeft || 0;\n  const offsetBottom = config.offsetBottom || 0;\n  const offsetRight = config.offsetRight || 0;\n\n  allowHorizontalScroll =\n    allowHorizontalScroll === undefined ? true : allowHorizontalScroll;\n\n  const isWin = util.isWindow(container);\n  const elemOffset = util.offset(elem);\n  const eh = util.outerHeight(elem);\n  const ew = util.outerWidth(elem);\n  let containerOffset;\n  let ch;\n  let cw;\n  let containerScroll;\n  let diffTop;\n  let diffBottom;\n  let win;\n  let winScroll;\n  let ww;\n  let wh;\n\n  if (isWin) {\n    win = container;\n    wh = util.height(win);\n    ww = util.width(win);\n    winScroll = {\n      left: util.scrollLeft(win),\n      top: util.scrollTop(win),\n    };\n    // elem 相对 container 可视视窗的距离\n    diffTop = {\n      left: elemOffset.left - winScroll.left - offsetLeft,\n      top: elemOffset.top - winScroll.top - offsetTop,\n    };\n    diffBottom = {\n      left: elemOffset.left + ew - (winScroll.left + ww) + offsetRight,\n      top: elemOffset.top + eh - (winScroll.top + wh) + offsetBottom,\n    };\n    containerScroll = winScroll;\n  } else {\n    containerOffset = util.offset(container);\n    ch = container.clientHeight;\n    cw = container.clientWidth;\n    containerScroll = {\n      left: container.scrollLeft,\n      top: container.scrollTop,\n    };\n    // elem 相对 container 可视视窗的距离\n    // 注意边框, offset 是边框到根节点\n    diffTop = {\n      left:\n        elemOffset.left -\n        (containerOffset.left +\n          (parseFloat(util.css(container, 'borderLeftWidth')) || 0)) -\n        offsetLeft,\n      top:\n        elemOffset.top -\n        (containerOffset.top +\n          (parseFloat(util.css(container, 'borderTopWidth')) || 0)) -\n        offsetTop,\n    };\n    diffBottom = {\n      left:\n        elemOffset.left +\n        ew -\n        (containerOffset.left +\n          cw +\n          (parseFloat(util.css(container, 'borderRightWidth')) || 0)) +\n        offsetRight,\n      top:\n        elemOffset.top +\n        eh -\n        (containerOffset.top +\n          ch +\n          (parseFloat(util.css(container, 'borderBottomWidth')) || 0)) +\n        offsetBottom,\n    };\n  }\n\n  if (diffTop.top < 0 || diffBottom.top > 0) {\n    // 强制向上\n    if (alignWithTop === true) {\n      util.scrollTop(container, containerScroll.top + diffTop.top);\n    } else if (alignWithTop === false) {\n      util.scrollTop(container, containerScroll.top + diffBottom.top);\n    } else {\n      // 自动调整\n      if (diffTop.top < 0) {\n        util.scrollTop(container, containerScroll.top + diffTop.top);\n      } else {\n        util.scrollTop(container, containerScroll.top + diffBottom.top);\n      }\n    }\n  } else {\n    if (!onlyScrollIfNeeded) {\n      alignWithTop = alignWithTop === undefined ? true : !!alignWithTop;\n      if (alignWithTop) {\n        util.scrollTop(container, containerScroll.top + diffTop.top);\n      } else {\n        util.scrollTop(container, containerScroll.top + diffBottom.top);\n      }\n    }\n  }\n\n  if (allowHorizontalScroll) {\n    if (diffTop.left < 0 || diffBottom.left > 0) {\n      // 强制向上\n      if (alignWithLeft === true) {\n        util.scrollLeft(container, containerScroll.left + diffTop.left);\n      } else if (alignWithLeft === false) {\n        util.scrollLeft(container, containerScroll.left + diffBottom.left);\n      } else {\n        // 自动调整\n        if (diffTop.left < 0) {\n          util.scrollLeft(container, containerScroll.left + diffTop.left);\n        } else {\n          util.scrollLeft(container, containerScroll.left + diffBottom.left);\n        }\n      }\n    } else {\n      if (!onlyScrollIfNeeded) {\n        alignWithLeft = alignWithLeft === undefined ? true : !!alignWithLeft;\n        if (alignWithLeft) {\n          util.scrollLeft(container, containerScroll.left + diffTop.left);\n        } else {\n          util.scrollLeft(container, containerScroll.left + diffBottom.left);\n        }\n      }\n    }\n  }\n}\n\nexport default scrollIntoView;\n","export default () => {};\n","/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\n// packages\nimport { cloneElement, Component, h } from 'preact';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n// internal\nimport debounce from '../utils/debounce';\nimport noop from '../utils/noop';\n\nclass Typeahead extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      highlightedIndex: null,\n      isOpen: false,\n    };\n\n    this.handleOnBlur = this.handleOnBlur.bind(this);\n    this.handleOnClear = this.handleOnClear.bind(this);\n    this.handleOnFocus = this.handleOnFocus.bind(this);\n    this.handleOnInput = this.handleOnInput.bind(this);\n    this.debouncedHandleOnInput = debounce(\n      this.handleOnInput,\n      this.props.debounceDuration\n    );\n    this.handleKeyDown = this.handleKeyDown.bind(this);\n    this.setInputRef = this.setInputRef.bind(this);\n    this.setMenuRef = this.setMenuRef.bind(this);\n    this.setItemRef = this.setItemRef.bind(this);\n\n    this.listRefs = {};\n  }\n\n  static getDerivedStateFromProps(_, prevState) {\n    if (prevState.highlightedIndex == null) {\n      return { highlightedIndex: 0 };\n    }\n  }\n\n  componentDidUpdate() {\n    const { highlightedIndex } = this.state;\n    const count = this.getFilteredItems(this.props).length;\n\n    if (Boolean(highlightedIndex) && highlightedIndex >= count) {\n      this.setState({ highlightedIndex: 0 });\n    }\n\n    this.maybeScrollItemIntoView();\n  }\n\n  setInputRef(element) {\n    this.inputRef = element;\n  }\n\n  setMenuRef(element) {\n    this.menuRef = element;\n  }\n\n  setItemRef(element, idx) {\n    this.listRefs[`item-${idx}`] = element;\n  }\n\n  maybeScrollItemIntoView() {\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (isOpen && highlightedIndex != null) {\n      const itemNode = this.listRefs[`item-${this.state.highlightedIndex}`];\n      const menuNode = this.menuRef;\n\n      if (itemNode && menuNode) {\n        scrollIntoView(itemNode, menuNode, {\n          onlyScrollIfNeeded: true,\n        });\n      }\n    }\n  }\n\n  getFilteredItems(props) {\n    let { items } = props;\n\n    const { shouldItemRender, sortItems } = props;\n\n    if (shouldItemRender) {\n      items = items.filter(item => shouldItemRender(item, props.value));\n    }\n\n    if (sortItems) {\n      items = items.sort((a, b) => sortItems(a, b, props.value));\n    }\n\n    return items;\n  }\n\n  highlightItemOnMouseEnter(highlightedIndex) {\n    this.setState({ highlightedIndex });\n  }\n\n  selectItemOnClick(item) {\n    const { getItemValue, onSelect } = this.props;\n\n    const value = getItemValue(item);\n\n    this.setState(\n      {\n        highlightedIndex: null,\n        isOpen: false,\n      },\n      () => {\n        this.inputRef.blur();\n        onSelect(value, item);\n      }\n    );\n  }\n\n  renderList() {\n    const { highlightedIndex } = this.state;\n    const props = this.props;\n\n    if (!props.value) return null;\n\n    const items = this.getFilteredItems(props);\n\n    return (\n      <ul\n        class=\"listbox t-sans\"\n        ref={this.setMenuRef}\n        onMouseDown={event => event.preventDefault()}\n      >\n        {items.map((item, idx) => {\n          return cloneElement(\n            props.renderItem(item, idx === highlightedIndex),\n            {\n              onClick: () => this.selectItemOnClick(item),\n              onMouseEnter: () => this.highlightItemOnMouseEnter(idx),\n              ref: el => this.setItemRef(el, idx),\n            }\n          );\n        })}\n        {items.length > 0 && props.renderAttribution()}\n      </ul>\n    );\n  }\n\n  handleOnClear(event) {\n    this.setState({ isOpen: false });\n\n    this.props.onClear(event);\n  }\n\n  handleOnBlur() {\n    this.setState({ isOpen: false });\n\n    const { onBlur } = this.props.inputProps;\n    if (onBlur) onBlur(event);\n  }\n\n  handleOnFocus(event) {\n    const { value } = this.props;\n\n    if (value.length > 0) this.setState({ isOpen: true });\n\n    const { onFocus } = this.props.inputProps;\n    if (onFocus) onFocus(event);\n  }\n\n  handleOnInput(event) {\n    const { value } = event.target;\n\n    this.props.onChange(value, event);\n\n    if (value.length <= 0) {\n      this.setState({ highlightedIndex: null });\n    }\n  }\n\n  handleKeyDown(event) {\n    const { isOpen } = this.state;\n\n    if (isOpen && Typeahead.keyEvents[event.key]) {\n      Typeahead.keyEvents[event.key].call(this, event);\n    } else if (!isOpen) {\n      this.setState({ isOpen: true });\n    }\n  }\n\n  render() {\n    const { inputProps, onClear, renderInput, value } = this.props;\n    const { isOpen } = this.state;\n\n    return (\n      <div class=\"typeahead\">\n        <div class=\"typeahead__input-wrapper\">\n          {renderInput({\n            ...inputProps,\n            role: 'combobox',\n            'aria-autocomplete': 'list',\n            'aria-expanded': String(isOpen),\n            autocomplete: 'off',\n            onBlur: this.handleOnBlur,\n            onFocus: this.handleOnFocus,\n            onInput: this.handleOnInput,\n            onKeyDown: this.handleKeyDown,\n            value,\n            ref: this.setInputRef,\n          })}\n          {onClear && value && (\n            <button\n              onClick={this.handleOnClear}\n              type=\"button\"\n              class=\"close\"\n              aria-label=\"Clear\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n          )}\n        </div>\n        {isOpen && this.renderList()}\n      </div>\n    );\n  }\n}\n\nTypeahead.defaultProps = {\n  debounceDuration: 150,\n  inputProps: {},\n  onChange: noop,\n  onClear: noop,\n  onSelect: noop,\n  renderInput: props => <input {...props} />,\n  value: '',\n};\n\nTypeahead.keyEvents = {\n  ArrowDown(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex < itemsCount - 1\n        ? highlightedIndex + 1\n        : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  ArrowUp(event) {\n    event.preventDefault();\n\n    const items = this.getFilteredItems(this.props);\n    const itemsCount = items.length;\n    if (itemsCount < 1) return;\n\n    const { highlightedIndex } = this.state;\n\n    const newIndex =\n      highlightedIndex > 0 ? highlightedIndex - 1 : highlightedIndex;\n\n    this.setState({ highlightedIndex: newIndex });\n  },\n\n  Enter(event) {\n    // not the right kind of Enter, abort\n    if (event.keyCode !== 13) return;\n\n    const { highlightedIndex, isOpen } = this.state;\n\n    if (!isOpen) {\n      // the menu is not open\n      return;\n    } else if (highlightedIndex == null) {\n      // input has control, but there's nothing selected\n      this.setState({ isOpen: false }, () => this.inputRef.select());\n    } else {\n      // the input has control and we have an item\n      event.preventDefault();\n\n      const item = this.getFilteredItems(this.props)[highlightedIndex];\n      const value = this.props.getItemValue(item);\n\n      this.setState(\n        {\n          highlightedIndex: null,\n          isOpen: false,\n        },\n        () => {\n          this.inputRef.setSelectionRange(value.length, value.length);\n          this.props.onSelect(value, item);\n        }\n      );\n    }\n  },\n\n  Escape() {\n    this.setState({\n      highlightedIndex: null,\n      isOpen: false,\n    });\n  },\n};\n\nexport default Typeahead;\n","/* eslint-disable jsx-a11y/label-has-associated-control */\nimport cx from 'classnames';\nimport { h, Component } from 'preact';\nimport debounce from '../utils/debounce';\n\n// components and uitls\nimport asyncComponent from '../components/AsyncComponent';\nimport Portal from '../components/Portal';\nimport Typeahead from '../components/Typeahead';\nimport { lookup } from '../utils/legislative-districts';\n\nconst sessionToken = new google.maps.places.AutocompleteSessionToken();\nconst autocompleteService = new google.maps.places.AutocompleteService();\n\nconst bounds = {\n  east: -93.514764,\n  west: -106.662177,\n  south: 25.843902,\n  north: 36.500199,\n};\n\nconst componentRestrictions = { country: 'us' };\n\nconst types = ['geocode'];\n\nconst getPredictions = input => {\n  return new Promise((resolve, reject) => {\n    autocompleteService.getPlacePredictions(\n      { bounds, componentRestrictions, input, sessionToken, types },\n      (predict, status) => {\n        if (status === 'OK') resolve(predict);\n\n        reject(new Error('No results found.'));\n      }\n    );\n  });\n};\n\n// always render what's provided, the geocoder decides\nconst shouldItemRender = () => true;\n\nconst AsyncCountyViewer = asyncComponent(() =>\n  import(\n    /* webpackPrefetch: true, webpackChunkName: \"CountyViewer\" */ '../components/CountyViewer'\n  )\n);\n\nclass Lookup extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      coordinates: null,\n      data: null,\n      lookupError: false,\n      lookupPending: false,\n      results: [],\n      value: '',\n    };\n\n    this.handleGeocode = this.handleGeocode.bind(this);\n    this.debouncedHandleGeocode = debounce(this.handleGeocode, 300);\n    this.onChange = this.onChange.bind(this);\n    this.onClear = this.onClear.bind(this);\n    this.onSelect = this.onSelect.bind(this);\n  }\n\n  componentDidMount() {\n    this.placesService = new google.maps.places.PlacesService(this.inputRef);\n  }\n\n  onClear() {\n    this.setState({ value: '' });\n  }\n\n  onChange(value) {\n    this.setState({ value }, this.debouncedHandleGeocode);\n  }\n\n  handleGeocode() {\n    const { value: input } = this.state;\n\n    getPredictions(input)\n      .then(results => this.setState({ results }))\n      .catch(() => this.setState({ results: [] }));\n  }\n\n  onSelect({ name, placeId }) {\n    this.setState({ lookupError: false, lookupPending: true, value: name });\n\n    this.placesService.getDetails(\n      {\n        fields: ['geometry.location'],\n        placeId,\n        sessionToken,\n      },\n      result => {\n        const {\n          lat: latitude,\n          lng: longitude,\n        } = result.geometry.location.toJSON();\n\n        const coordinates = { latitude, longitude };\n\n        // looks up the county, sboe district, us house, tx house and tx senate districts\n        lookup(coordinates)\n          .then(({ data }) => {\n            this.setState({ coordinates, data, lookupPending: false });\n          })\n          .catch(() =>\n            this.setState({\n              data: null,\n              lookupError: true,\n              lookupPending: false,\n            })\n          );\n      }\n    );\n  }\n\n  render() {\n    const {\n      coordinates,\n      data,\n      lookupError,\n      lookupPending,\n      results,\n      value,\n    } = this.state;\n\n    let addressFeedback = null;\n\n    if (lookupPending) {\n      addressFeedback = (\n        <p class=\"copy\">\n          Finding your details...{' '}\n          <svg class=\"icon icon-spinner animate-pulse\">\n            <use xlinkHref=\"#icon-spinner\" />\n          </svg>\n        </p>\n      );\n    }\n\n    if (lookupError) {\n      addressFeedback = (\n        <p class=\"copy\">\n          Hmm... we were unable to find your county in Texas. Please check your\n          address and try again!\n        </p>\n      );\n    }\n\n    if (coordinates && !lookupPending && !lookupError) {\n      addressFeedback = <p class=\"copy t-weight-bold\">We found your county!</p>;\n    }\n\n    return (\n      <div class=\"address-input\">\n        {/* <svg class=\"icon icon-drawn-left-arrow\">\n          <use xlinkHref=\"#icon-drawn-left-arrow\"></use>\n        </svg> */}\n        <label class=\"address-input__label t-sans\" for=\"address-input\">\n          Enter an address or a county:\n        </label>\n        <Typeahead\n          inputProps={{\n            id: 'address-input',\n            class: 'address-input__input',\n            placeholder: '1010 Colorado St, Austin, TX, 78701',\n          }}\n          items={results}\n          getItemValue={item => ({\n            name: item.description,\n            placeId: item.place_id,\n          })}\n          value={value}\n          onChange={this.onChange}\n          onClear={this.onClear}\n          onSelect={this.onSelect}\n          renderItem={(item, isHighlighted) => (\n            <li\n              class={cx('listbox__item', {\n                'listbox__item--highlighted': isHighlighted,\n              })}\n              key={item.id}\n            >\n              {item.description}\n            </li>\n          )}\n          renderAttribution={() => (\n            <li class=\"listbox__item listbox__item--attribution\">\n              <img\n                alt=\"Powered by Google\"\n                src=\"assets/images/powered-by-google.png\"\n              />\n            </li>\n          )}\n          shouldItemRender={shouldItemRender}\n          renderInput={props => (\n            <input\n              {...props}\n              ref={el => {\n                props.ref(el);\n                this.inputRef = el;\n              }}\n            />\n          )}\n        />\n        {/* <div class=\"disclaimer-lookup t-sans\">\n          * Turnout includes mail-in ballots received before Oct. 13.\n        </div> */}\n        <div id=\"address-feedback\"></div>\n\n        <Portal node={document.getElementById('address-feedback')}>\n          {addressFeedback}\n        </Portal>\n\n        <Portal node={document.getElementById('lookup-county')}>\n          {data ? (\n            // you need this surrounding container! or else the whole thing explodes\n            <div>\n              <AsyncCountyViewer\n                key={data.county.fips}\n                county={data.county.name}\n                fips={data.county.fips}\n                section=\"lookup\"\n              />\n            </div>\n          ) : (\n            ''\n            // <div>\n            //   <AsyncCountyViewer county=\"Total\" section=\"lookup\" />\n            // </div>\n          )}\n        </Portal>\n      </div>\n    );\n  }\n}\n\nexport default Lookup;\n","import getJSON from './get-json';\n\nconst LOOKUP_URL = ({ latitude, longitude }) =>\n  `https://dv-dev.texastribune.org/legislative-lookup/?latitude=${latitude}&longitude=${longitude}`;\n\nexport function lookup({ latitude, longitude }) {\n  return getJSON(LOOKUP_URL({ latitude, longitude }));\n}\n","import { Component } from 'preact';\n\nfunction shallowEqual(a, b) {\n  for (let key in a) {\n    if (a[key] !== b[key]) {\n      return false;\n    }\n  }\n\n  for (let key in b) {\n    if (!(key in a)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nclass PureComponent extends Component {\n  shouldComponentUpdate(props, state) {\n    return !(\n      shallowEqual(props, this.props) && shallowEqual(state, this.state)\n    );\n  }\n}\n\nexport default PureComponent;\n","/**\n * A wrapper for the initial response from a fetch call that funnels to\n * res.json().\n *\n * @private\n * @param {Response} res\n * @returns {Promise}\n */\nfunction jsonResponse(res) {\n  if (!res.ok) throw new Error(`${res.status}: ${res.statusText}`);\n\n  return res.json();\n}\n\n/**\n * A light wrapper around fetch that assumes you're seeking a JSON response.\n *\n * @param {String|Request} input\n * @param {Object} init\n * @returns {Promise}\n */\nexport default function getJSON(input, init) {\n  return fetch(input, init).then(jsonResponse);\n}\n","export default function _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}"],"sourceRoot":""}