{"version":3,"sources":["webpack:///./node_modules/d3-time/src/utcMinute.js","webpack:///./node_modules/d3-selection/src/index.js","webpack:///./node_modules/d3-format/src/precisionPrefix.js","webpack:///./node_modules/d3-format/src/precisionRound.js","webpack:///./node_modules/d3-format/src/precisionFixed.js","webpack:///./node_modules/d3-interpolate/src/basis.js","webpack:///./node_modules/d3-interpolate/src/rgb.js","webpack:///./node_modules/d3-interpolate/src/basisClosed.js","webpack:///./node_modules/d3-selection/src/mouse.js","webpack:///./node_modules/d3-selection/src/namespaces.js","webpack:///./node_modules/d3-interpolate/src/number.js","webpack:///./node_modules/d3-selection/src/selection/sparse.js","webpack:///./node_modules/d3-selection/src/selection/enter.js","webpack:///./node_modules/d3-selection/src/selection/data.js","webpack:///./node_modules/d3-selection/src/selection/sort.js","webpack:///./node_modules/d3-selection/src/selection/call.js","webpack:///./node_modules/d3-selection/src/selection/attr.js","webpack:///./node_modules/d3-selection/src/selection/property.js","webpack:///./node_modules/d3-selection/src/selection/classed.js","webpack:///./node_modules/d3-selection/src/selection/text.js","webpack:///./node_modules/d3-selection/src/selection/html.js","webpack:///./node_modules/d3-selection/src/selection/raise.js","webpack:///./node_modules/d3-selection/src/selection/lower.js","webpack:///./node_modules/d3-selection/src/selection/insert.js","webpack:///./node_modules/d3-selection/src/selection/remove.js","webpack:///./node_modules/d3-selection/src/selection/clone.js","webpack:///./node_modules/d3-selection/src/selection/dispatch.js","webpack:///./node_modules/d3-selection/src/selection/index.js","webpack:///./node_modules/d3-selection/src/selection/select.js","webpack:///./node_modules/d3-selection/src/selection/selectAll.js","webpack:///./node_modules/d3-selection/src/selection/filter.js","webpack:///./node_modules/d3-selection/src/constant.js","webpack:///./node_modules/d3-selection/src/selection/exit.js","webpack:///./node_modules/d3-selection/src/selection/join.js","webpack:///./node_modules/d3-selection/src/selection/merge.js","webpack:///./node_modules/d3-selection/src/selection/order.js","webpack:///./node_modules/d3-selection/src/selection/nodes.js","webpack:///./node_modules/d3-selection/src/selection/node.js","webpack:///./node_modules/d3-selection/src/selection/size.js","webpack:///./node_modules/d3-selection/src/selection/empty.js","webpack:///./node_modules/d3-selection/src/selection/each.js","webpack:///./node_modules/d3-selection/src/selection/append.js","webpack:///./node_modules/d3-selection/src/selection/datum.js","webpack:///../src/apmonth.js","webpack:///../src/utils.js","webpack:///../src/intcomma.js","webpack:///../src/pluralize.js","webpack:///../src/widont.js","webpack:///./node_modules/d3-interpolate/src/numberArray.js","webpack:///./node_modules/d3-interpolate/src/array.js","webpack:///./node_modules/d3-interpolate/src/date.js","webpack:///./node_modules/d3-interpolate/src/object.js","webpack:///./node_modules/d3-interpolate/src/value.js","webpack:///./node_modules/d3-selection/src/point.js","webpack:///./node_modules/d3-time/src/utcHour.js","webpack:///./node_modules/d3-selection/src/select.js","webpack:///./node_modules/d3-selection/src/selection/on.js","webpack:///./node_modules/d3-format/src/formatSpecifier.js","webpack:///./node_modules/d3-selection/src/matcher.js","webpack:///./node_modules/d3-format/src/defaultLocale.js","webpack:///./node_modules/d3-selection/src/selectAll.js","webpack:///./node_modules/d3-color/src/color.js","webpack:///./node_modules/d3-time/src/duration.js","webpack:///./node_modules/d3-time/src/millisecond.js","webpack:///./node_modules/d3-time/src/interval.js","webpack:///./node_modules/d3-time/src/utcWeek.js","webpack:///./node_modules/d3-time/src/minute.js","webpack:///./node_modules/lodash/lodash.js","webpack:///./node_modules/d3-dsv/src/dsv.js","webpack:///./node_modules/d3-selection/src/selection/style.js","webpack:///./node_modules/d3-timer/src/timeout.js","webpack:///./node_modules/d3-selection/src/selectorAll.js","webpack:///./node_modules/d3-axis/src/array.js","webpack:///./node_modules/d3-axis/src/identity.js","webpack:///./node_modules/d3-axis/src/axis.js","webpack:///./node_modules/d3-selection/src/sourceEvent.js","webpack:///./node_modules/d3-time-format/src/locale.js","webpack:///./node_modules/d3-time-format/src/defaultLocale.js","webpack:///./node_modules/d3-selection/src/creator.js","webpack:///./node_modules/d3-time/src/utcMonth.js","webpack:///./node_modules/d3-dsv/src/csv.js","webpack:///./node_modules/d3/dist/package.js","webpack:///./node_modules/d3-brush/src/brush.js","webpack:///./node_modules/d3-chord/src/math.js","webpack:///./node_modules/d3-chord/src/array.js","webpack:///./node_modules/d3-chord/src/chord.js","webpack:///./node_modules/d3-path/src/path.js","webpack:///./node_modules/d3-chord/src/ribbon.js","webpack:///./node_modules/d3-contour/src/array.js","webpack:///./node_modules/d3-fetch/src/buffer.js","webpack:///./node_modules/d3-fetch/src/text.js","webpack:///./node_modules/d3-fetch/src/dsv.js","webpack:///./node_modules/d3-fetch/src/xml.js","webpack:///./node_modules/d3-quadtree/src/add.js","webpack:///./node_modules/d3-quadtree/src/cover.js","webpack:///./node_modules/d3-quadtree/src/quad.js","webpack:///./node_modules/d3-quadtree/src/x.js","webpack:///./node_modules/d3-quadtree/src/y.js","webpack:///./node_modules/d3-quadtree/src/quadtree.js","webpack:///./node_modules/d3-quadtree/src/data.js","webpack:///./node_modules/d3-quadtree/src/extent.js","webpack:///./node_modules/d3-quadtree/src/find.js","webpack:///./node_modules/d3-quadtree/src/remove.js","webpack:///./node_modules/d3-quadtree/src/root.js","webpack:///./node_modules/d3-quadtree/src/size.js","webpack:///./node_modules/d3-quadtree/src/visit.js","webpack:///./node_modules/d3-quadtree/src/visitAfter.js","webpack:///./node_modules/d3-force/src/simulation.js","webpack:///./node_modules/d3-geo/src/identity.js","webpack:///./node_modules/d3-geo/src/stream.js","webpack:///./node_modules/d3-geo/src/adder.js","webpack:///./node_modules/d3-geo/src/math.js","webpack:///./node_modules/d3-geo/src/noop.js","webpack:///./node_modules/d3-geo/src/path/area.js","webpack:///./node_modules/d3-geo/src/path/bounds.js","webpack:///./node_modules/d3-geo/src/path/centroid.js","webpack:///./node_modules/d3-geo/src/path/context.js","webpack:///./node_modules/d3-geo/src/path/measure.js","webpack:///./node_modules/d3-geo/src/path/string.js","webpack:///./node_modules/d3-geo/src/path/index.js","webpack:///./node_modules/d3-geo/src/clip/rejoin.js","webpack:///./node_modules/d3-geo/src/pointEqual.js","webpack:///./node_modules/d3-geo/src/clip/rectangle.js","webpack:///./node_modules/d3-geo/src/clip/buffer.js","webpack:///./node_modules/d3-geo/src/clip/line.js","webpack:///./node_modules/d3-geo/src/transform.js","webpack:///./node_modules/d3-geo/src/projection/fit.js","webpack:///./node_modules/d3-geo/src/projection/identity.js","webpack:///./node_modules/d3-random/src/defaultSource.js","webpack:///./node_modules/d3-random/src/normal.js","webpack:///./node_modules/d3-random/src/uniform.js","webpack:///./node_modules/d3-random/src/irwinHall.js","webpack:///./node_modules/d3-random/src/logNormal.js","webpack:///./node_modules/d3-random/src/bates.js","webpack:///./node_modules/d3-random/src/exponential.js","webpack:///./node_modules/d3-shape/src/constant.js","webpack:///./node_modules/d3-shape/src/curve/linear.js","webpack:///./node_modules/d3-shape/src/point.js","webpack:///./node_modules/d3-shape/src/line.js","webpack:///./node_modules/d3-voronoi/src/RedBlackTree.js","webpack:///./node_modules/d3-voronoi/src/Edge.js","webpack:///./node_modules/d3-voronoi/src/Cell.js","webpack:///./node_modules/d3-voronoi/src/Circle.js","webpack:///./node_modules/d3-voronoi/src/Beach.js","webpack:///./node_modules/d3-voronoi/src/Diagram.js","webpack:///./node_modules/d3-interpolate/src/zoom.js","webpack:///./node_modules/d3-zoom/src/transform.js","webpack:///./node_modules/d3-interpolate/src/round.js","webpack:///./node_modules/intersection-observer/intersection-observer.js","webpack:///./node_modules/d3-time/src/second.js","webpack:///./node_modules/d3-color/src/define.js","webpack:///./node_modules/d3-selection/src/touch.js","webpack:///(webpack)/buildin/module.js","webpack:///./node_modules/d3-selection/src/selector.js","webpack:///./node_modules/d3-selection/src/namespace.js","webpack:///./node_modules/d3-time/src/utcDay.js","webpack:///./node_modules/d3-collection/src/map.js","webpack:///./node_modules/d3-collection/src/nest.js","webpack:///./node_modules/d3-collection/src/set.js","webpack:///./node_modules/d3-collection/src/keys.js","webpack:///./node_modules/d3-time/src/utcYear.js","webpack:///./node_modules/d3-time/src/day.js","webpack:///./node_modules/d3-timer/src/timer.js","webpack:///./node_modules/d3-interpolate/src/string.js","webpack:///./node_modules/d3-time/src/month.js","webpack:///./node_modules/d3-time/src/year.js","webpack:///./node_modules/d3-selection/src/window.js","webpack:///./node_modules/d3-format/src/exponent.js","webpack:///./node_modules/d3-format/src/formatDecimal.js","webpack:///./node_modules/d3-format/src/index.js","webpack:///./node_modules/d3-time/src/hour.js","webpack:///./node_modules/d3-interpolate/src/color.js","webpack:///./node_modules/d3-transition/src/transition/schedule.js","webpack:///./node_modules/d3-transition/src/interrupt.js","webpack:///./node_modules/d3-interpolate/src/transform/parse.js","webpack:///./node_modules/d3-interpolate/src/transform/decompose.js","webpack:///./node_modules/d3-interpolate/src/transform/index.js","webpack:///./node_modules/d3-transition/src/transition/tween.js","webpack:///./node_modules/d3-transition/src/transition/interpolate.js","webpack:///./node_modules/d3-transition/src/transition/attr.js","webpack:///./node_modules/d3-transition/src/transition/attrTween.js","webpack:///./node_modules/d3-transition/src/transition/delay.js","webpack:///./node_modules/d3-transition/src/transition/duration.js","webpack:///./node_modules/d3-transition/src/transition/ease.js","webpack:///./node_modules/d3-transition/src/transition/on.js","webpack:///./node_modules/d3-transition/src/transition/remove.js","webpack:///./node_modules/d3-transition/src/transition/selection.js","webpack:///./node_modules/d3-transition/src/transition/style.js","webpack:///./node_modules/d3-transition/src/transition/styleTween.js","webpack:///./node_modules/d3-transition/src/transition/textTween.js","webpack:///./node_modules/d3-transition/src/transition/index.js","webpack:///./node_modules/d3-transition/src/transition/select.js","webpack:///./node_modules/d3-transition/src/transition/selectAll.js","webpack:///./node_modules/d3-transition/src/transition/filter.js","webpack:///./node_modules/d3-transition/src/transition/merge.js","webpack:///./node_modules/d3-transition/src/transition/transition.js","webpack:///./node_modules/d3-transition/src/transition/text.js","webpack:///./node_modules/d3-transition/src/transition/end.js","webpack:///./node_modules/d3-transition/src/selection/transition.js","webpack:///./node_modules/d3-ease/src/cubic.js","webpack:///./node_modules/d3-transition/src/selection/index.js","webpack:///./node_modules/d3-transition/src/selection/interrupt.js","webpack:///./node_modules/d3-time/src/week.js","webpack:///./node_modules/d3-format/src/formatPrefixAuto.js","webpack:///./node_modules/d3-format/src/formatRounded.js","webpack:///./node_modules/d3-format/src/formatTypes.js","webpack:///./node_modules/d3-format/src/identity.js","webpack:///./node_modules/d3-format/src/locale.js","webpack:///./node_modules/d3-format/src/formatGroup.js","webpack:///./node_modules/d3-format/src/formatNumerals.js","webpack:///./node_modules/d3-format/src/formatTrim.js","webpack:///./node_modules/d3-array/src/ascending.js","webpack:///./node_modules/d3-array/src/bisector.js","webpack:///./node_modules/d3-array/src/bisect.js","webpack:///./node_modules/d3-array/src/cross.js","webpack:///./node_modules/d3-array/src/number.js","webpack:///./node_modules/d3-array/src/extent.js","webpack:///./node_modules/d3-array/src/array.js","webpack:///./node_modules/d3-array/src/range.js","webpack:///./node_modules/d3-array/src/ticks.js","webpack:///./node_modules/d3-array/src/threshold/sturges.js","webpack:///./node_modules/d3-array/src/quantile.js","webpack:///./node_modules/d3-array/src/max.js","webpack:///./node_modules/d3-array/src/merge.js","webpack:///./node_modules/d3-array/src/min.js","webpack:///./node_modules/d3-array/src/sum.js","webpack:///./node_modules/d3-dsv/src/tsv.js","webpack:///./node_modules/d3-dispatch/src/dispatch.js","webpack:///./node_modules/d3-interpolate/src/constant.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/d3-scale/src/init.js","webpack:///./node_modules/d3-scale/src/array.js","webpack:///./node_modules/d3-scale/src/number.js","webpack:///./node_modules/d3-scale/src/continuous.js","webpack:///./node_modules/d3-scale/src/constant.js","webpack:///./node_modules/d3-scale/src/linear.js","webpack:///./node_modules/d3-scale/src/tickFormat.js","webpack:///./node_modules/d3-scale/src/nice.js","webpack:///./node_modules/d3-scale/src/pow.js","webpack:///./node_modules/d3-scale/src/quantile.js","webpack:///./node_modules/d3-scale/src/quantize.js","webpack:///./node_modules/d3-scale/src/time.js"],"names":["utcMinute","interval","date","setUTCSeconds","step","setTime","durationMinute","start","end","getUTCMinutes","range","value","Math","max","min","floor","exponent","abs","basis","t1","v0","v1","v2","v3","t2","t3","rgbGamma","y","color","gamma","rgb","r","colorRgb","g","b","opacity","nogamma","t","rgbSpline","spline","colors","i","n","length","Array","values","node","event","sourceEvent","changedTouches","point","xhtml","svg","xlink","xml","xmlns","a","update","EnterNode","parent","datum","this","ownerDocument","namespaceURI","_next","_parent","__data__","prototype","constructor","appendChild","child","insertBefore","next","querySelector","selector","querySelectorAll","bindIndex","group","enter","exit","data","groupLength","dataLength","bindKey","key","keyValue","nodeByKeyValue","keyValues","call","ascending","NaN","attrRemove","name","removeAttribute","attrRemoveNS","fullname","removeAttributeNS","space","local","attrConstant","setAttribute","attrConstantNS","setAttributeNS","attrFunction","v","apply","arguments","attrFunctionNS","propertyRemove","propertyConstant","propertyFunction","classArray","string","trim","split","classList","ClassList","_node","_names","getAttribute","classedAdd","names","list","add","classedRemove","remove","classedTrue","classedFalse","classedFunction","indexOf","push","join","splice","contains","textRemove","textContent","textConstant","textFunction","htmlRemove","innerHTML","htmlConstant","htmlFunction","raise","nextSibling","parentNode","lower","previousSibling","firstChild","constantNull","removeChild","selection_cloneShallow","clone","cloneNode","selection_cloneDeep","dispatchEvent","type","params","window","defaultView","CustomEvent","document","createEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","root","Selection","groups","parents","_groups","_parents","selection","documentElement","select","m","subgroups","j","subnode","subgroup","selectAll","selectorAll","filter","match","matcher","size","each","d","x","bind","enterGroup","updateGroup","previous","i0","i1","_enter","_exit","map","sparse","onenter","onupdate","onexit","append","merge","order","groups0","groups1","m0","m1","merges","group0","group1","compareDocumentPosition","sort","compare","compareNode","sortgroups","sortgroup","callback","nodes","empty","attr","namespace","getAttributeNS","style","selection_style","property","classed","text","html","create","creator","insert","before","deep","on","selection_on","dispatch","AP_MONTHS","apmonth","Date","getMonth","isNil","_isFinite","isFinite","intcomma","val","parts","convertedVal","toString","replace","pluralize","pluralSuffix","singularSuffix","isArray","Number","const","widontRegex","RegExp","widont","replaceChar","String","c","slice","isNumberArray","ArrayBuffer","isView","DataView","genericArray","nb","na","k","constant","number","numberArray","valueOf","isNaN","object","ownerSVGElement","createSVGPoint","clientX","clientY","matrixTransform","getScreenCTM","inverse","rect","getBoundingClientRect","left","clientLeft","top","clientTop","utcHour","setUTCMinutes","durationHour","getUTCHours","filterEvents","mouseenter","mouseleave","filterContextListener","listener","index","contextListener","related","relatedTarget","event1","event0","parseTypenames","typenames","onRemove","typename","__on","o","removeEventListener","capture","onAdd","wrap","hasOwnProperty","addEventListener","customEvent","that","args","re","formatSpecifier","specifier","exec","Error","FormatSpecifier","fill","align","sign","symbol","zero","width","comma","precision","undefined","matches","locale","format","formatPrefix","definition","decimal","thousands","grouping","currency","minus","formatLocale","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","formatHex","color_formatRgb","formatRgb","l","toLowerCase","parseInt","rgbn","Rgb","rgba","hsla","rgbConvert","rgb_formatHex","hex","rgb_formatRgb","round","h","s","Hsl","hslConvert","hsl2rgb","m2","define","copy","channels","Object","assign","displayable","formatHsl","extend","pow","durationSecond","durationDay","durationWeek","millisecond","every","t0","newInterval","floori","offseti","count","field","ceil","d0","d1","offset","stop","test","utcWeekday","setUTCDate","getUTCDate","getUTCDay","setUTCHours","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","minute","getMilliseconds","getSeconds","getMinutes","FUNC_ERROR_TEXT","PLACEHOLDER","wrapFlags","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","source","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrim","reTrimStart","reTrimEnd","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsComboRange","rsComboMarksRange","rsBreakRange","rsMathOpRange","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsMiscLower","rsMiscUpper","reOptMod","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","parseFloat","freeParseInt","freeGlobal","global","freeSelf","self","Function","freeExports","exports","nodeType","freeModule","module","moduleExports","freeProcess","process","nodeUtil","types","require","binding","e","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","func","thisArg","arrayAggregator","array","setter","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","result","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","basePropertyOf","baseReduce","current","baseTimes","baseUnary","baseValues","props","cacheHas","cache","has","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","countHolders","placeholder","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","mapToArray","forEach","overArg","transform","arg","replaceHolders","setToArray","set","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","unicodeToArray","asciiToArray","unescapeHtmlChar","_","runInContext","context","uid","defaults","pick","TypeError","arrayProto","funcProto","objectProto","coreJsData","funcToString","idCounter","maskSrcKey","keys","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Symbol","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","toStringTag","defineProperty","getNative","ctxClearTimeout","clearTimeout","ctxNow","now","ctxSetTimeout","setTimeout","nativeCeil","nativeFloor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","nativeNow","nativeParseInt","nativeRandom","random","nativeReverse","reverse","Map","Promise","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","symbolToString","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","proto","isObject","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","clear","entry","ListCache","MapCache","SetCache","Stack","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","paths","skip","get","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","input","initCloneArray","tag","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","Ctor","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","includes","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","pop","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","isFunction","baseGet","path","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","other","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInvoke","last","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","message","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","baseIsNative","baseIteratee","identity","baseMatchesProperty","baseMatches","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","newValue","isTyped","isArrayLikeObject","isPlainObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","comparer","baseSortBy","objCriteria","criteria","othCriteria","ordersLength","compareAscending","compareMultiple","basePickBy","baseSet","basePullAll","basePullAt","indexes","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","MAX_ARRAY_LENGTH","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","actions","action","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","id","arrayBuffer","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createCaseFirst","methodName","charAt","trailing","createCompounder","words","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","newHolders","createRecurry","fn","reorder","createInverter","toIteratee","baseInverter","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","toInteger","pair","noop","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrLength","arrStacked","arrValue","flatten","otherFunc","getValue","stubArray","hasPath","hasFunc","isLength","resolve","ctorString","isMaskable","stubFalse","otherArgs","oldArray","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","charCodeAt","quote","subString","difference","differenceBy","differenceWith","findIndex","findLastIndex","head","intersection","mapped","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","unzipWith","without","xor","xorBy","xorWith","zip","zipWith","chain","interceptor","wrapperAt","countBy","find","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","WRAP_BIND_FLAG","debounce","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","cancel","flush","defer","delay","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isNumber","isString","lt","lte","toArray","done","iteratorToArray","remainder","toLength","isBinary","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","omit","CLONE_DEEP_FLAG","basePick","pickBy","prop","toPairs","toPairsIn","camelCase","word","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","toUpperCase","pattern","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","method","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","subtract","minuend","subtrahend","after","castArray","chunk","compact","concat","cond","conforms","baseConforms","properties","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","baseFill","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","reject","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","updateWith","valuesIn","zipObject","zipObjectDeep","entriesIn","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","target","position","escape","escapeRegExp","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEmpty","isEqual","isEqualWith","isMatch","isMatchWith","isNative","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","lastIndexOf","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","pad","strLength","padEnd","padStart","radix","floating","temp","reduce","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","settings","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","times","toLower","toSafeInteger","toUpper","trimEnd","trimStart","truncate","omission","search","substring","newEnd","unescape","uniqueId","prefix","eachRight","first","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","EOL","EOF","objectConverter","columns","JSON","stringify","inferColumns","rows","columnSet","row","column","formatDate","year","hours","minutes","seconds","getUTCSeconds","milliseconds","getUTCMilliseconds","getUTCFullYear","getUTCMonth","delimiter","reFormat","DELIMITER","parseRows","f","N","I","eof","eol","token","preformatBody","formatValue","formatRow","parse","customConverter","formatBody","formatRows","styleRemove","removeProperty","styleConstant","priority","setProperty","styleFunction","styleValue","getPropertyValue","getComputedStyle","Timer","restart","elapsed","translateX","translateY","scale","center","bandwidth","entering","__axis","axis","orient","tickArguments","tickValues","tickFormat","tickSizeInner","tickSizeOuter","tickPadding","ticks","domain","spacing","range0","range1","tick","tickExit","tickEnter","line","transition","p","tickSize","axisBottom","axisLeft","localDate","H","M","S","L","setFullYear","utcDate","UTC","setUTCFullYear","newDate","timeFormat","utcFormat","pads","numberRe","percentRe","requoteRe","requote","formatRe","formatLookup","parseWeekdayNumberSunday","w","parseWeekdayNumberMonday","u","parseWeekNumberSunday","U","parseWeekNumberISO","V","parseWeekNumberMonday","W","parseFullYear","parseYear","parseZone","Z","parseQuarter","q","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","Q","parseUnixTimestampSeconds","formatDayOfMonth","getDate","formatHour24","getHours","formatHour12","formatDayOfYear","timeDay","timeYear","formatMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","formatWeekdayNumberMonday","day","getDay","formatWeekNumberSunday","timeSunday","formatWeekNumberISO","timeThursday","formatWeekdayNumberSunday","formatWeekNumberMonday","timeMonday","formatYear","getFullYear","formatFullYear","formatZone","z","getTimezoneOffset","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","utcDay","utcYear","formatUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCFullYear","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_weekdays","days","locale_shortWeekdays","shortDays","locale_months","months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","utcFormats","parses","parseSpecifier","newFormat","newParse","week","X","utcParse","creatorInherit","uri","createElement","createElementNS","creatorFixed","utcMonth","setUTCMonth","csv","dsv","csvParse","number1","number2","cos","sin","PI","pi","tau","tauEpsilon","Path","_x0","_y0","_x1","_y1","moveTo","closePath","lineTo","quadraticCurveTo","x1","y1","bezierCurveTo","x2","y2","arcTo","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","sqrt","l01","acos","t01","t21","arc","a0","a1","ccw","dx","dy","cw","da","responseText","response","ok","status","statusText","init","fetch","then","dsvParse","tsvParse","parser","DOMParser","parseFromString","tree","xm","ym","xp","yp","right","bottom","_root","leaf","_x","_y","defaultX","defaultY","quadtree","Quadtree","addAll","leaf_copy","treeProto","cover","xz","yz","visit","extent","radius","x3","y3","quads","Quad","d2","retainer","removeAll","visitAfter","streamGeometry","geometry","stream","streamGeometryType","streamObjectType","Feature","FeatureCollection","features","Sphere","sphere","Point","coordinates","MultiPoint","LineString","streamLine","MultiLineString","Polygon","streamPolygon","MultiPolygon","GeometryCollection","geometries","closed","coordinate","lineStart","lineEnd","polygonStart","polygonEnd","Adder","reset","adder","bv","av","atan","atan2","exp","log","x00","y00","areaSum","areaRingSum","areaStream","areaRingStart","areaRingEnd","area","areaPointFirst","areaPoint","boundsStream","bounds","X0","Y0","Z0","X1","Y1","Z1","X2","Y2","Z2","centroidStream","centroidPoint","centroidLineStart","centroidLineEnd","centroidRingStart","centroidRingEnd","centroid","centroidPointFirstLine","centroidPointLine","centroidPointFirstRing","centroidPointRing","PathContext","_context","_radius","pointRadius","_line","_point","lengthRing","lengthSum","lengthStream","lengthPointFirst","lengthPoint","PathString","_string","circle","_circle","projection","projectionStream","contextStream","pathArea","measure","pathMeasure","pathBounds","pathCentroid","Intersection","points","segments","compareIntersection","startInside","subject","clip","segment","p0","p1","link","isSubject","clipRectangle","visible","from","to","direction","corner","comparePoint","ca","cb","polygon","ring","x__","y__","v__","x_","y_","v_","clean","lines","activeStream","bufferStream","rejoin","shift","clipStream","linePoint","winding","b0","b1","polygonInside","cleanInside","clipRejoin","ax","ay","clipLine","transformer","methods","TransformStream","fit","fitBounds","clipExtent","translate","geoStream","fitExtent","scaleTranslate","kx","ky","tx","ty","cacheStream","sx","sy","postclip","reflectX","reflectY","fitSize","fitWidth","fitHeight","height","sourceRandomUniform","randomUniform","defaultSource","sourceRandomNormal","randomNormal","mu","sigma","sourceRandomLogNormal","randomLogNormal","normal","sourceRandomIrwinHall","randomIrwinHall","sourceRandomBates","randomBates","irwinHall","sourceRandomExponential","randomExponential","lambda","Linear","areaStart","areaEnd","pointX","pointY","defined","curve","curveLinear","output","defined0","RedBlackTree","RedBlackNode","C","R","P","RedBlackRotateLeft","RedBlackRotateRight","RedBlackFirst","grandpa","uncle","sibling","createEdge","edge","edges","setEdgeEnd","cells","halfedges","createBorderEdge","vertex","clipEdge","connectEdge","fm","fb","lx","ly","rx","ry","fx","fy","cellHalfedgeAngle","cell","site","va","vb","cellHalfedgeStart","cellHalfedgeEnd","firstCircle","circlePool","Circle","cy","attachCircle","lArc","rArc","lSite","cSite","rSite","bx","by","cx","epsilon2","ha","hc","circles","detachCircle","beachPool","Beach","createBeach","beach","detachBeach","beaches","removeBeach","disappearing","epsilon","unshift","iArc","nArcs","addBeach","dxl","dxr","directrix","leftBreakPoint","rightBreakPoint","createCell","newArc","hb","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","lexicographic","Diagram","sites","sortCellHalfedges","clipEdges","iCell","iHalfedge","nHalfedges","startX","startY","endX","endY","nCells","dc","v00","v01","v11","v10","clipCells","polygons","triangles","s0","e1","s1","links","_found","vx","vy","SQRT2","Transform","applyX","applyY","location","invertX","invertY","rescaleX","rescaleY","IntersectionObserverEntry","intersectionRatio","registry","IntersectionObserver","THROTTLE_TIMEOUT","POLL_INTERVAL","USE_MUTATION_OBSERVER","observe","_observationTargets","item","element","_registerInstance","_monitorIntersections","_checkForIntersections","unobserve","_unmonitorIntersections","_unregisterInstance","disconnect","takeRecords","records","_queuedEntries","_initThresholds","opt_threshold","threshold","_parseRootMargin","opt_rootMargin","margins","margin","unit","_monitoringIntersections","_monitoringInterval","setInterval","addEvent","_domObserver","MutationObserver","attributes","childList","characterData","subtree","clearInterval","removeEvent","rootIsInDom","_rootIsInDom","rootRect","_getRootRect","targetRect","rootContainsTarget","_rootContainsTarget","oldEntry","intersectionRect","_computeTargetAndRootIntersection","newEntry","performance","boundingClientRect","rootBounds","_hasCrossedThreshold","isIntersecting","_callback","display","rect1","rect2","getParentNode","atRoot","parentRect","parentComputedStyle","body","overflow","clientWidth","clientHeight","_expandRectByRootMargin","_rootMarginValues","newRect","oldRatio","newRatio","thresholds","containsDeep","targetArea","intersectionArea","toFixed","opt_options","timeout","timer","rootMargin","opt_useCapture","attachEvent","detatchEvent","el","err","host","second","factory","touches","identifier","touch","webpackPolyfill","deprecate","children","enumerable","none","namespaces","sortValues","rollup","nest","sortKeys","createResult","setResult","valuesByKey","createObject","setObject","createMap","setMap","sortKey","setHours","setDate","taskHead","taskTail","frame","clockLast","clockNow","clockSkew","clock","setFrame","requestAnimationFrame","clearNow","_call","_time","wake","timerFlush","sleep","nap","poke","reA","reB","am","bm","bs","bi","one","month","setMonth","formatDecimal","toExponential","coefficient","hour","linear","hue","exponential","emptyOn","emptyTween","timing","schedules","__transition","tween","state","duration","ease","schedule","cssNode","cssRoot","cssView","svgNode","active","degrees","rotate","skewX","scaleX","scaleY","interpolateTransform","pxComma","pxParen","degParen","xa","ya","xb","yb","interpolateTransformCss","decompose","interpolateTransformSvg","baseVal","consolidate","matrix","tweenRemove","tween0","tween1","tweenFunction","tweenValue","_id","interpolateNumber","interpolateRgb","interpolateString","value1","string00","interpolate0","string1","string0","string10","attrInterpolate","attrInterpolateNS","attrTweenNS","_value","attrTween","delayFunction","delayConstant","durationFunction","durationConstant","easeConstant","onFunction","on0","on1","sit","styleInterpolate","styleTween","textInterpolate","textTween","Transition","_name","newId","selection_prototype","inherit","id0","id1","styleNull","listener0","styleMaybeRemove","interrupt","defaultTiming","weekday","sunday","monday","tuesday","wednesday","thursday","friday","saturday","prefixExponent","toPrecision","formatRounded","prefixes","currencyPrefix","currencySuffix","numerals","formatNumerals","percent","nan","formatTypes","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","formatTrim","padding","lo","hi","ascendingBisect","bisector","bisectRight","valueof","e10","e5","e2","tickIncrement","power","LN10","error","tickStep","step0","step1","LN2","value0","merged","tsv","Dispatch","T","initRange","normalize","clamper","bimap","r0","r1","polymap","bisect","unknown","untransform","piecewise","rescale","rangeRound","interpolateRound","continuous","linearish","precisionPrefix","precisionRound","precisionFixed","nice","transformPow","transformSqrt","transformSquare","powish","quantile","invertExtent","quantiles","quantize","calendar","formatMillisecond","formatSecond","formatMinute","formatHour","formatDay","formatWeek","formatMonth","tickIntervals","tickInterval","timeMonth","timeWeek","timeHour","timeMinute","timeSecond","timeMillisecond"],"mappings":"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","file":"1.c1ab248dfc.mjs","sourcesContent":["import interval from \"./interval.js\";\nimport {durationMinute} from \"./duration.js\";\n\nvar utcMinute = interval(function(date) {\n  date.setUTCSeconds(0, 0);\n}, function(date, step) {\n  date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n  return (end - start) / durationMinute;\n}, function(date) {\n  return date.getUTCMinutes();\n});\n\nexport default utcMinute;\nexport var utcMinutes = utcMinute.range;\n","export {default as create} from \"./create\";\nexport {default as creator} from \"./creator\";\nexport {default as local} from \"./local\";\nexport {default as matcher} from \"./matcher\";\nexport {default as mouse} from \"./mouse\";\nexport {default as namespace} from \"./namespace\";\nexport {default as namespaces} from \"./namespaces\";\nexport {default as clientPoint} from \"./point\";\nexport {default as select} from \"./select\";\nexport {default as selectAll} from \"./selectAll\";\nexport {default as selection} from \"./selection/index\";\nexport {default as selector} from \"./selector\";\nexport {default as selectorAll} from \"./selectorAll\";\nexport {styleValue as style} from \"./selection/style\";\nexport {default as touch} from \"./touch\";\nexport {default as touches} from \"./touches\";\nexport {default as window} from \"./window\";\nexport {event, customEvent} from \"./selection/on\";\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n  return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n  step = Math.abs(step), max = Math.abs(max) - step;\n  return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n  return Math.max(0, -exponent(Math.abs(step)));\n}\n","export function basis(t1, v0, v1, v2, v3) {\n  var t2 = t1 * t1, t3 = t2 * t1;\n  return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n      + (4 - 6 * t2 + 3 * t3) * v1\n      + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n      + t3 * v3) / 6;\n}\n\nexport default function(values) {\n  var n = values.length - 1;\n  return function(t) {\n    var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n        v1 = values[i],\n        v2 = values[i + 1],\n        v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n        v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n    return basis((t - i / n) * n, v0, v1, v2, v3);\n  };\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n  var color = gamma(y);\n\n  function rgb(start, end) {\n    var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n        g = color(start.g, end.g),\n        b = color(start.b, end.b),\n        opacity = nogamma(start.opacity, end.opacity);\n    return function(t) {\n      start.r = r(t);\n      start.g = g(t);\n      start.b = b(t);\n      start.opacity = opacity(t);\n      return start + \"\";\n    };\n  }\n\n  rgb.gamma = rgbGamma;\n\n  return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n  return function(colors) {\n    var n = colors.length,\n        r = new Array(n),\n        g = new Array(n),\n        b = new Array(n),\n        i, color;\n    for (i = 0; i < n; ++i) {\n      color = colorRgb(colors[i]);\n      r[i] = color.r || 0;\n      g[i] = color.g || 0;\n      b[i] = color.b || 0;\n    }\n    r = spline(r);\n    g = spline(g);\n    b = spline(b);\n    color.opacity = 1;\n    return function(t) {\n      color.r = r(t);\n      color.g = g(t);\n      color.b = b(t);\n      return color + \"\";\n    };\n  };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n  var n = values.length;\n  return function(t) {\n    var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n        v0 = values[(i + n - 1) % n],\n        v1 = values[i % n],\n        v2 = values[(i + 1) % n],\n        v3 = values[(i + 2) % n];\n    return basis((t - i / n) * n, v0, v1, v2, v3);\n  };\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node) {\n  var event = sourceEvent();\n  if (event.changedTouches) event = event.changedTouches[0];\n  return point(node, event);\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n  svg: \"http://www.w3.org/2000/svg\",\n  xhtml: xhtml,\n  xlink: \"http://www.w3.org/1999/xlink\",\n  xml: \"http://www.w3.org/XML/1998/namespace\",\n  xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","export default function(a, b) {\n  return a = +a, b = +b, function(t) {\n    return a * (1 - t) + b * t;\n  };\n}\n","export default function(update) {\n  return new Array(update.length);\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n  return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n  this.ownerDocument = parent.ownerDocument;\n  this.namespaceURI = parent.namespaceURI;\n  this._next = null;\n  this._parent = parent;\n  this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n  constructor: EnterNode,\n  appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n  insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n  querySelector: function(selector) { return this._parent.querySelector(selector); },\n  querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","import {Selection} from \"./index\";\nimport {EnterNode} from \"./enter\";\nimport constant from \"../constant\";\n\nvar keyPrefix = \"$\"; // Protect against keys like “__proto__”.\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n  var i = 0,\n      node,\n      groupLength = group.length,\n      dataLength = data.length;\n\n  // Put any non-null nodes that fit into update.\n  // Put any null nodes into enter.\n  // Put any remaining data into enter.\n  for (; i < dataLength; ++i) {\n    if (node = group[i]) {\n      node.__data__ = data[i];\n      update[i] = node;\n    } else {\n      enter[i] = new EnterNode(parent, data[i]);\n    }\n  }\n\n  // Put any non-null nodes that don’t fit into exit.\n  for (; i < groupLength; ++i) {\n    if (node = group[i]) {\n      exit[i] = node;\n    }\n  }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n  var i,\n      node,\n      nodeByKeyValue = {},\n      groupLength = group.length,\n      dataLength = data.length,\n      keyValues = new Array(groupLength),\n      keyValue;\n\n  // Compute the key for each node.\n  // If multiple nodes have the same key, the duplicates are added to exit.\n  for (i = 0; i < groupLength; ++i) {\n    if (node = group[i]) {\n      keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);\n      if (keyValue in nodeByKeyValue) {\n        exit[i] = node;\n      } else {\n        nodeByKeyValue[keyValue] = node;\n      }\n    }\n  }\n\n  // Compute the key for each datum.\n  // If there a node associated with this key, join and add it to update.\n  // If there is not (or the key is a duplicate), add it to enter.\n  for (i = 0; i < dataLength; ++i) {\n    keyValue = keyPrefix + key.call(parent, data[i], i, data);\n    if (node = nodeByKeyValue[keyValue]) {\n      update[i] = node;\n      node.__data__ = data[i];\n      nodeByKeyValue[keyValue] = null;\n    } else {\n      enter[i] = new EnterNode(parent, data[i]);\n    }\n  }\n\n  // Add any remaining nodes that were not bound to data to exit.\n  for (i = 0; i < groupLength; ++i) {\n    if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {\n      exit[i] = node;\n    }\n  }\n}\n\nexport default function(value, key) {\n  if (!value) {\n    data = new Array(this.size()), j = -1;\n    this.each(function(d) { data[++j] = d; });\n    return data;\n  }\n\n  var bind = key ? bindKey : bindIndex,\n      parents = this._parents,\n      groups = this._groups;\n\n  if (typeof value !== \"function\") value = constant(value);\n\n  for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n    var parent = parents[j],\n        group = groups[j],\n        groupLength = group.length,\n        data = value.call(parent, parent && parent.__data__, j, parents),\n        dataLength = data.length,\n        enterGroup = enter[j] = new Array(dataLength),\n        updateGroup = update[j] = new Array(dataLength),\n        exitGroup = exit[j] = new Array(groupLength);\n\n    bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n    // Now connect the enter nodes to their following update node, such that\n    // appendChild can insert the materialized enter node before this node,\n    // rather than at the end of the parent node.\n    for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n      if (previous = enterGroup[i0]) {\n        if (i0 >= i1) i1 = i0 + 1;\n        while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n        previous._next = next || null;\n      }\n    }\n  }\n\n  update = new Selection(update, parents);\n  update._enter = enter;\n  update._exit = exit;\n  return update;\n}\n","import {Selection} from \"./index\";\n\nexport default function(compare) {\n  if (!compare) compare = ascending;\n\n  function compareNode(a, b) {\n    return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n  }\n\n  for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n      if (node = group[i]) {\n        sortgroup[i] = node;\n      }\n    }\n    sortgroup.sort(compareNode);\n  }\n\n  return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n  var callback = arguments[0];\n  arguments[0] = this;\n  callback.apply(null, arguments);\n  return this;\n}\n","import namespace from \"../namespace\";\n\nfunction attrRemove(name) {\n  return function() {\n    this.removeAttribute(name);\n  };\n}\n\nfunction attrRemoveNS(fullname) {\n  return function() {\n    this.removeAttributeNS(fullname.space, fullname.local);\n  };\n}\n\nfunction attrConstant(name, value) {\n  return function() {\n    this.setAttribute(name, value);\n  };\n}\n\nfunction attrConstantNS(fullname, value) {\n  return function() {\n    this.setAttributeNS(fullname.space, fullname.local, value);\n  };\n}\n\nfunction attrFunction(name, value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) this.removeAttribute(name);\n    else this.setAttribute(name, v);\n  };\n}\n\nfunction attrFunctionNS(fullname, value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n    else this.setAttributeNS(fullname.space, fullname.local, v);\n  };\n}\n\nexport default function(name, value) {\n  var fullname = namespace(name);\n\n  if (arguments.length < 2) {\n    var node = this.node();\n    return fullname.local\n        ? node.getAttributeNS(fullname.space, fullname.local)\n        : node.getAttribute(fullname);\n  }\n\n  return this.each((value == null\n      ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n      ? (fullname.local ? attrFunctionNS : attrFunction)\n      : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","function propertyRemove(name) {\n  return function() {\n    delete this[name];\n  };\n}\n\nfunction propertyConstant(name, value) {\n  return function() {\n    this[name] = value;\n  };\n}\n\nfunction propertyFunction(name, value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) delete this[name];\n    else this[name] = v;\n  };\n}\n\nexport default function(name, value) {\n  return arguments.length > 1\n      ? this.each((value == null\n          ? propertyRemove : typeof value === \"function\"\n          ? propertyFunction\n          : propertyConstant)(name, value))\n      : this.node()[name];\n}\n","function classArray(string) {\n  return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n  return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n  this._node = node;\n  this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n  add: function(name) {\n    var i = this._names.indexOf(name);\n    if (i < 0) {\n      this._names.push(name);\n      this._node.setAttribute(\"class\", this._names.join(\" \"));\n    }\n  },\n  remove: function(name) {\n    var i = this._names.indexOf(name);\n    if (i >= 0) {\n      this._names.splice(i, 1);\n      this._node.setAttribute(\"class\", this._names.join(\" \"));\n    }\n  },\n  contains: function(name) {\n    return this._names.indexOf(name) >= 0;\n  }\n};\n\nfunction classedAdd(node, names) {\n  var list = classList(node), i = -1, n = names.length;\n  while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n  var list = classList(node), i = -1, n = names.length;\n  while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n  return function() {\n    classedAdd(this, names);\n  };\n}\n\nfunction classedFalse(names) {\n  return function() {\n    classedRemove(this, names);\n  };\n}\n\nfunction classedFunction(names, value) {\n  return function() {\n    (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n  };\n}\n\nexport default function(name, value) {\n  var names = classArray(name + \"\");\n\n  if (arguments.length < 2) {\n    var list = classList(this.node()), i = -1, n = names.length;\n    while (++i < n) if (!list.contains(names[i])) return false;\n    return true;\n  }\n\n  return this.each((typeof value === \"function\"\n      ? classedFunction : value\n      ? classedTrue\n      : classedFalse)(names, value));\n}\n","function textRemove() {\n  this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n  return function() {\n    this.textContent = value;\n  };\n}\n\nfunction textFunction(value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    this.textContent = v == null ? \"\" : v;\n  };\n}\n\nexport default function(value) {\n  return arguments.length\n      ? this.each(value == null\n          ? textRemove : (typeof value === \"function\"\n          ? textFunction\n          : textConstant)(value))\n      : this.node().textContent;\n}\n","function htmlRemove() {\n  this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n  return function() {\n    this.innerHTML = value;\n  };\n}\n\nfunction htmlFunction(value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    this.innerHTML = v == null ? \"\" : v;\n  };\n}\n\nexport default function(value) {\n  return arguments.length\n      ? this.each(value == null\n          ? htmlRemove : (typeof value === \"function\"\n          ? htmlFunction\n          : htmlConstant)(value))\n      : this.node().innerHTML;\n}\n","function raise() {\n  if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n  return this.each(raise);\n}\n","function lower() {\n  if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n  return this.each(lower);\n}\n","import creator from \"../creator\";\nimport selector from \"../selector\";\n\nfunction constantNull() {\n  return null;\n}\n\nexport default function(name, before) {\n  var create = typeof name === \"function\" ? name : creator(name),\n      select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n  return this.select(function() {\n    return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n  });\n}\n","function remove() {\n  var parent = this.parentNode;\n  if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n  return this.each(remove);\n}\n","function selection_cloneShallow() {\n  var clone = this.cloneNode(false), parent = this.parentNode;\n  return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n  var clone = this.cloneNode(true), parent = this.parentNode;\n  return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n  return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","import defaultView from \"../window\";\n\nfunction dispatchEvent(node, type, params) {\n  var window = defaultView(node),\n      event = window.CustomEvent;\n\n  if (typeof event === \"function\") {\n    event = new event(type, params);\n  } else {\n    event = window.document.createEvent(\"Event\");\n    if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n    else event.initEvent(type, false, false);\n  }\n\n  node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n  return function() {\n    return dispatchEvent(this, type, params);\n  };\n}\n\nfunction dispatchFunction(type, params) {\n  return function() {\n    return dispatchEvent(this, type, params.apply(this, arguments));\n  };\n}\n\nexport default function(type, params) {\n  return this.each((typeof params === \"function\"\n      ? dispatchFunction\n      : dispatchConstant)(type, params));\n}\n","import selection_select from \"./select\";\nimport selection_selectAll from \"./selectAll\";\nimport selection_filter from \"./filter\";\nimport selection_data from \"./data\";\nimport selection_enter from \"./enter\";\nimport selection_exit from \"./exit\";\nimport selection_join from \"./join\";\nimport selection_merge from \"./merge\";\nimport selection_order from \"./order\";\nimport selection_sort from \"./sort\";\nimport selection_call from \"./call\";\nimport selection_nodes from \"./nodes\";\nimport selection_node from \"./node\";\nimport selection_size from \"./size\";\nimport selection_empty from \"./empty\";\nimport selection_each from \"./each\";\nimport selection_attr from \"./attr\";\nimport selection_style from \"./style\";\nimport selection_property from \"./property\";\nimport selection_classed from \"./classed\";\nimport selection_text from \"./text\";\nimport selection_html from \"./html\";\nimport selection_raise from \"./raise\";\nimport selection_lower from \"./lower\";\nimport selection_append from \"./append\";\nimport selection_insert from \"./insert\";\nimport selection_remove from \"./remove\";\nimport selection_clone from \"./clone\";\nimport selection_datum from \"./datum\";\nimport selection_on from \"./on\";\nimport selection_dispatch from \"./dispatch\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n  this._groups = groups;\n  this._parents = parents;\n}\n\nfunction selection() {\n  return new Selection([[document.documentElement]], root);\n}\n\nSelection.prototype = selection.prototype = {\n  constructor: Selection,\n  select: selection_select,\n  selectAll: selection_selectAll,\n  filter: selection_filter,\n  data: selection_data,\n  enter: selection_enter,\n  exit: selection_exit,\n  join: selection_join,\n  merge: selection_merge,\n  order: selection_order,\n  sort: selection_sort,\n  call: selection_call,\n  nodes: selection_nodes,\n  node: selection_node,\n  size: selection_size,\n  empty: selection_empty,\n  each: selection_each,\n  attr: selection_attr,\n  style: selection_style,\n  property: selection_property,\n  classed: selection_classed,\n  text: selection_text,\n  html: selection_html,\n  raise: selection_raise,\n  lower: selection_lower,\n  append: selection_append,\n  insert: selection_insert,\n  remove: selection_remove,\n  clone: selection_clone,\n  datum: selection_datum,\n  on: selection_on,\n  dispatch: selection_dispatch\n};\n\nexport default selection;\n","import {Selection} from \"./index\";\nimport selector from \"../selector\";\n\nexport default function(select) {\n  if (typeof select !== \"function\") select = selector(select);\n\n  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n      if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n        if (\"__data__\" in node) subnode.__data__ = node.__data__;\n        subgroup[i] = subnode;\n      }\n    }\n  }\n\n  return new Selection(subgroups, this._parents);\n}\n","import {Selection} from \"./index\";\nimport selectorAll from \"../selectorAll\";\n\nexport default function(select) {\n  if (typeof select !== \"function\") select = selectorAll(select);\n\n  for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n      if (node = group[i]) {\n        subgroups.push(select.call(node, node.__data__, i, group));\n        parents.push(node);\n      }\n    }\n  }\n\n  return new Selection(subgroups, parents);\n}\n","import {Selection} from \"./index\";\nimport matcher from \"../matcher\";\n\nexport default function(match) {\n  if (typeof match !== \"function\") match = matcher(match);\n\n  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n      if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n        subgroup.push(node);\n      }\n    }\n  }\n\n  return new Selection(subgroups, this._parents);\n}\n","export default function(x) {\n  return function() {\n    return x;\n  };\n}\n","import sparse from \"./sparse\";\nimport {Selection} from \"./index\";\n\nexport default function() {\n  return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n  var enter = this.enter(), update = this, exit = this.exit();\n  enter = typeof onenter === \"function\" ? onenter(enter) : enter.append(onenter + \"\");\n  if (onupdate != null) update = onupdate(update);\n  if (onexit == null) exit.remove(); else onexit(exit);\n  return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index\";\n\nexport default function(selection) {\n\n  for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n    for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n      if (node = group0[i] || group1[i]) {\n        merge[i] = node;\n      }\n    }\n  }\n\n  for (; j < m0; ++j) {\n    merges[j] = groups0[j];\n  }\n\n  return new Selection(merges, this._parents);\n}\n","export default function() {\n\n  for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n    for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n      if (node = group[i]) {\n        if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n        next = node;\n      }\n    }\n  }\n\n  return this;\n}\n","export default function() {\n  var nodes = new Array(this.size()), i = -1;\n  this.each(function() { nodes[++i] = this; });\n  return nodes;\n}\n","export default function() {\n\n  for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n    for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n      var node = group[i];\n      if (node) return node;\n    }\n  }\n\n  return null;\n}\n","export default function() {\n  var size = 0;\n  this.each(function() { ++size; });\n  return size;\n}\n","export default function() {\n  return !this.node();\n}\n","export default function(callback) {\n\n  for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n    for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n      if (node = group[i]) callback.call(node, node.__data__, i, group);\n    }\n  }\n\n  return this;\n}\n","import creator from \"../creator\";\n\nexport default function(name) {\n  var create = typeof name === \"function\" ? name : creator(name);\n  return this.select(function() {\n    return this.appendChild(create.apply(this, arguments));\n  });\n}\n","export default function(value) {\n  return arguments.length\n      ? this.property(\"__data__\", value)\n      : this.node().__data__;\n}\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","/**\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","/**\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","export default function(a, b) {\n  if (!b) b = [];\n  var n = a ? Math.min(b.length, a.length) : 0,\n      c = b.slice(),\n      i;\n  return function(t) {\n    for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n    return c;\n  };\n}\n\nexport function isNumberArray(x) {\n  return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n  return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n  var nb = b ? b.length : 0,\n      na = a ? Math.min(nb, a.length) : 0,\n      x = new Array(na),\n      c = new Array(nb),\n      i;\n\n  for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n  for (; i < nb; ++i) c[i] = b[i];\n\n  return function(t) {\n    for (i = 0; i < na; ++i) c[i] = x[i](t);\n    return c;\n  };\n}\n","export default function(a, b) {\n  var d = new Date;\n  return a = +a, b = +b, function(t) {\n    return d.setTime(a * (1 - t) + b * t), d;\n  };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n  var i = {},\n      c = {},\n      k;\n\n  if (a === null || typeof a !== \"object\") a = {};\n  if (b === null || typeof b !== \"object\") b = {};\n\n  for (k in b) {\n    if (k in a) {\n      i[k] = value(a[k], b[k]);\n    } else {\n      c[k] = b[k];\n    }\n  }\n\n  return function(t) {\n    for (k in i) c[k] = i[k](t);\n    return c;\n  };\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n  var t = typeof b, c;\n  return b == null || t === \"boolean\" ? constant(b)\n      : (t === \"number\" ? number\n      : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n      : b instanceof color ? rgb\n      : b instanceof Date ? date\n      : isNumberArray(b) ? numberArray\n      : Array.isArray(b) ? genericArray\n      : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n      : number)(a, b);\n}\n","export default function(node, event) {\n  var svg = node.ownerSVGElement || node;\n\n  if (svg.createSVGPoint) {\n    var point = svg.createSVGPoint();\n    point.x = event.clientX, point.y = event.clientY;\n    point = point.matrixTransform(node.getScreenCTM().inverse());\n    return [point.x, point.y];\n  }\n\n  var rect = node.getBoundingClientRect();\n  return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n}\n","import interval from \"./interval.js\";\nimport {durationHour} from \"./duration.js\";\n\nvar utcHour = interval(function(date) {\n  date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n  date.setTime(+date + step * durationHour);\n}, function(start, end) {\n  return (end - start) / durationHour;\n}, function(date) {\n  return date.getUTCHours();\n});\n\nexport default utcHour;\nexport var utcHours = utcHour.range;\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n  return typeof selector === \"string\"\n      ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n      : new Selection([[selector]], root);\n}\n","var filterEvents = {};\n\nexport var event = null;\n\nif (typeof document !== \"undefined\") {\n  var element = document.documentElement;\n  if (!(\"onmouseenter\" in element)) {\n    filterEvents = {mouseenter: \"mouseover\", mouseleave: \"mouseout\"};\n  }\n}\n\nfunction filterContextListener(listener, index, group) {\n  listener = contextListener(listener, index, group);\n  return function(event) {\n    var related = event.relatedTarget;\n    if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {\n      listener.call(this, event);\n    }\n  };\n}\n\nfunction contextListener(listener, index, group) {\n  return function(event1) {\n    var event0 = event; // Events can be reentrant (e.g., focus).\n    event = event1;\n    try {\n      listener.call(this, this.__data__, index, group);\n    } finally {\n      event = event0;\n    }\n  };\n}\n\nfunction parseTypenames(typenames) {\n  return typenames.trim().split(/^|\\s+/).map(function(t) {\n    var name = \"\", i = t.indexOf(\".\");\n    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n    return {type: t, name: name};\n  });\n}\n\nfunction onRemove(typename) {\n  return function() {\n    var on = this.__on;\n    if (!on) return;\n    for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n      if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n        this.removeEventListener(o.type, o.listener, o.capture);\n      } else {\n        on[++i] = o;\n      }\n    }\n    if (++i) on.length = i;\n    else delete this.__on;\n  };\n}\n\nfunction onAdd(typename, value, capture) {\n  var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;\n  return function(d, i, group) {\n    var on = this.__on, o, listener = wrap(value, i, group);\n    if (on) for (var j = 0, m = on.length; j < m; ++j) {\n      if ((o = on[j]).type === typename.type && o.name === typename.name) {\n        this.removeEventListener(o.type, o.listener, o.capture);\n        this.addEventListener(o.type, o.listener = listener, o.capture = capture);\n        o.value = value;\n        return;\n      }\n    }\n    this.addEventListener(typename.type, listener, capture);\n    o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};\n    if (!on) this.__on = [o];\n    else on.push(o);\n  };\n}\n\nexport default function(typename, value, capture) {\n  var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n  if (arguments.length < 2) {\n    var on = this.node().__on;\n    if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n      for (i = 0, o = on[j]; i < n; ++i) {\n        if ((t = typenames[i]).type === o.type && t.name === o.name) {\n          return o.value;\n        }\n      }\n    }\n    return;\n  }\n\n  on = value ? onAdd : onRemove;\n  if (capture == null) capture = false;\n  for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));\n  return this;\n}\n\nexport function customEvent(event1, listener, that, args) {\n  var event0 = event;\n  event1.sourceEvent = event;\n  event = event1;\n  try {\n    return listener.apply(that, args);\n  } finally {\n    event = event0;\n  }\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n  if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n  var match;\n  return new FormatSpecifier({\n    fill: match[1],\n    align: match[2],\n    sign: match[3],\n    symbol: match[4],\n    zero: match[5],\n    width: match[6],\n    comma: match[7],\n    precision: match[8] && match[8].slice(1),\n    trim: match[9],\n    type: match[10]\n  });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n  this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n  this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n  this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n  this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n  this.zero = !!specifier.zero;\n  this.width = specifier.width === undefined ? undefined : +specifier.width;\n  this.comma = !!specifier.comma;\n  this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n  this.trim = !!specifier.trim;\n  this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n  return this.fill\n      + this.align\n      + this.sign\n      + this.symbol\n      + (this.zero ? \"0\" : \"\")\n      + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n      + (this.comma ? \",\" : \"\")\n      + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n      + (this.trim ? \"~\" : \"\")\n      + this.type;\n};\n","export default function(selector) {\n  return function() {\n    return this.matches(selector);\n  };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n  decimal: \".\",\n  thousands: \",\",\n  grouping: [3],\n  currency: [\"$\", \"\"],\n  minus: \"-\"\n});\n\nexport default function defaultLocale(definition) {\n  locale = formatLocale(definition);\n  format = locale.format;\n  formatPrefix = locale.formatPrefix;\n  return locale;\n}\n","import {Selection, root} from \"./selection/index\";\n\nexport default function(selector) {\n  return typeof selector === \"string\"\n      ? new Selection([document.querySelectorAll(selector)], [document.documentElement])\n      : new Selection([selector == null ? [] : selector], root);\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n    reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n    reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n    reHex = /^#([0-9a-f]{3,8})$/,\n    reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n    reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n    reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n    reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n    reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n    reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\nvar named = {\n  aliceblue: 0xf0f8ff,\n  antiquewhite: 0xfaebd7,\n  aqua: 0x00ffff,\n  aquamarine: 0x7fffd4,\n  azure: 0xf0ffff,\n  beige: 0xf5f5dc,\n  bisque: 0xffe4c4,\n  black: 0x000000,\n  blanchedalmond: 0xffebcd,\n  blue: 0x0000ff,\n  blueviolet: 0x8a2be2,\n  brown: 0xa52a2a,\n  burlywood: 0xdeb887,\n  cadetblue: 0x5f9ea0,\n  chartreuse: 0x7fff00,\n  chocolate: 0xd2691e,\n  coral: 0xff7f50,\n  cornflowerblue: 0x6495ed,\n  cornsilk: 0xfff8dc,\n  crimson: 0xdc143c,\n  cyan: 0x00ffff,\n  darkblue: 0x00008b,\n  darkcyan: 0x008b8b,\n  darkgoldenrod: 0xb8860b,\n  darkgray: 0xa9a9a9,\n  darkgreen: 0x006400,\n  darkgrey: 0xa9a9a9,\n  darkkhaki: 0xbdb76b,\n  darkmagenta: 0x8b008b,\n  darkolivegreen: 0x556b2f,\n  darkorange: 0xff8c00,\n  darkorchid: 0x9932cc,\n  darkred: 0x8b0000,\n  darksalmon: 0xe9967a,\n  darkseagreen: 0x8fbc8f,\n  darkslateblue: 0x483d8b,\n  darkslategray: 0x2f4f4f,\n  darkslategrey: 0x2f4f4f,\n  darkturquoise: 0x00ced1,\n  darkviolet: 0x9400d3,\n  deeppink: 0xff1493,\n  deepskyblue: 0x00bfff,\n  dimgray: 0x696969,\n  dimgrey: 0x696969,\n  dodgerblue: 0x1e90ff,\n  firebrick: 0xb22222,\n  floralwhite: 0xfffaf0,\n  forestgreen: 0x228b22,\n  fuchsia: 0xff00ff,\n  gainsboro: 0xdcdcdc,\n  ghostwhite: 0xf8f8ff,\n  gold: 0xffd700,\n  goldenrod: 0xdaa520,\n  gray: 0x808080,\n  green: 0x008000,\n  greenyellow: 0xadff2f,\n  grey: 0x808080,\n  honeydew: 0xf0fff0,\n  hotpink: 0xff69b4,\n  indianred: 0xcd5c5c,\n  indigo: 0x4b0082,\n  ivory: 0xfffff0,\n  khaki: 0xf0e68c,\n  lavender: 0xe6e6fa,\n  lavenderblush: 0xfff0f5,\n  lawngreen: 0x7cfc00,\n  lemonchiffon: 0xfffacd,\n  lightblue: 0xadd8e6,\n  lightcoral: 0xf08080,\n  lightcyan: 0xe0ffff,\n  lightgoldenrodyellow: 0xfafad2,\n  lightgray: 0xd3d3d3,\n  lightgreen: 0x90ee90,\n  lightgrey: 0xd3d3d3,\n  lightpink: 0xffb6c1,\n  lightsalmon: 0xffa07a,\n  lightseagreen: 0x20b2aa,\n  lightskyblue: 0x87cefa,\n  lightslategray: 0x778899,\n  lightslategrey: 0x778899,\n  lightsteelblue: 0xb0c4de,\n  lightyellow: 0xffffe0,\n  lime: 0x00ff00,\n  limegreen: 0x32cd32,\n  linen: 0xfaf0e6,\n  magenta: 0xff00ff,\n  maroon: 0x800000,\n  mediumaquamarine: 0x66cdaa,\n  mediumblue: 0x0000cd,\n  mediumorchid: 0xba55d3,\n  mediumpurple: 0x9370db,\n  mediumseagreen: 0x3cb371,\n  mediumslateblue: 0x7b68ee,\n  mediumspringgreen: 0x00fa9a,\n  mediumturquoise: 0x48d1cc,\n  mediumvioletred: 0xc71585,\n  midnightblue: 0x191970,\n  mintcream: 0xf5fffa,\n  mistyrose: 0xffe4e1,\n  moccasin: 0xffe4b5,\n  navajowhite: 0xffdead,\n  navy: 0x000080,\n  oldlace: 0xfdf5e6,\n  olive: 0x808000,\n  olivedrab: 0x6b8e23,\n  orange: 0xffa500,\n  orangered: 0xff4500,\n  orchid: 0xda70d6,\n  palegoldenrod: 0xeee8aa,\n  palegreen: 0x98fb98,\n  paleturquoise: 0xafeeee,\n  palevioletred: 0xdb7093,\n  papayawhip: 0xffefd5,\n  peachpuff: 0xffdab9,\n  peru: 0xcd853f,\n  pink: 0xffc0cb,\n  plum: 0xdda0dd,\n  powderblue: 0xb0e0e6,\n  purple: 0x800080,\n  rebeccapurple: 0x663399,\n  red: 0xff0000,\n  rosybrown: 0xbc8f8f,\n  royalblue: 0x4169e1,\n  saddlebrown: 0x8b4513,\n  salmon: 0xfa8072,\n  sandybrown: 0xf4a460,\n  seagreen: 0x2e8b57,\n  seashell: 0xfff5ee,\n  sienna: 0xa0522d,\n  silver: 0xc0c0c0,\n  skyblue: 0x87ceeb,\n  slateblue: 0x6a5acd,\n  slategray: 0x708090,\n  slategrey: 0x708090,\n  snow: 0xfffafa,\n  springgreen: 0x00ff7f,\n  steelblue: 0x4682b4,\n  tan: 0xd2b48c,\n  teal: 0x008080,\n  thistle: 0xd8bfd8,\n  tomato: 0xff6347,\n  turquoise: 0x40e0d0,\n  violet: 0xee82ee,\n  wheat: 0xf5deb3,\n  white: 0xffffff,\n  whitesmoke: 0xf5f5f5,\n  yellow: 0xffff00,\n  yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n  copy: function(channels) {\n    return Object.assign(new this.constructor, this, channels);\n  },\n  displayable: function() {\n    return this.rgb().displayable();\n  },\n  hex: color_formatHex, // Deprecated! Use color.formatHex.\n  formatHex: color_formatHex,\n  formatHsl: color_formatHsl,\n  formatRgb: color_formatRgb,\n  toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n  return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n  return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n  return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n  var m, l;\n  format = (format + \"\").trim().toLowerCase();\n  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n      : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n      : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n      : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n      : null) // invalid hex\n      : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n      : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n      : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n      : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n      : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n      : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n      : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n      : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n      : null;\n}\n\nfunction rgbn(n) {\n  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n  if (a <= 0) r = g = b = NaN;\n  return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Rgb;\n  o = o.rgb();\n  return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n  this.r = +r;\n  this.g = +g;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n  brighter: function(k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  darker: function(k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  rgb: function() {\n    return this;\n  },\n  displayable: function() {\n    return (-0.5 <= this.r && this.r < 255.5)\n        && (-0.5 <= this.g && this.g < 255.5)\n        && (-0.5 <= this.b && this.b < 255.5)\n        && (0 <= this.opacity && this.opacity <= 1);\n  },\n  hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n  formatHex: rgb_formatHex,\n  formatRgb: rgb_formatRgb,\n  toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n  return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n  var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n  return (a === 1 ? \"rgb(\" : \"rgba(\")\n      + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n      + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n      + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n      + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n  value = Math.max(0, Math.min(255, Math.round(value) || 0));\n  return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n  if (a <= 0) h = s = l = NaN;\n  else if (l <= 0 || l >= 1) h = s = NaN;\n  else if (s <= 0) h = NaN;\n  return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Hsl;\n  if (o instanceof Hsl) return o;\n  o = o.rgb();\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      h = NaN,\n      s = max - min,\n      l = (max + min) / 2;\n  if (s) {\n    if (r === max) h = (g - b) / s + (g < b) * 6;\n    else if (g === max) h = (b - r) / s + 2;\n    else h = (r - g) / s + 4;\n    s /= l < 0.5 ? max + min : 2 - max - min;\n    h *= 60;\n  } else {\n    s = l > 0 && l < 1 ? 0 : h;\n  }\n  return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n  brighter: function(k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function(k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function() {\n    var h = this.h % 360 + (this.h < 0) * 360,\n        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n        l = this.l,\n        m2 = l + (l < 0.5 ? l : 1 - l) * s,\n        m1 = 2 * l - m2;\n    return new Rgb(\n      hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n      hsl2rgb(h, m1, m2),\n      hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n      this.opacity\n    );\n  },\n  displayable: function() {\n    return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n        && (0 <= this.l && this.l <= 1)\n        && (0 <= this.opacity && this.opacity <= 1);\n  },\n  formatHsl: function() {\n    var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"hsl(\" : \"hsla(\")\n        + (this.h || 0) + \", \"\n        + (this.s || 0) * 100 + \"%, \"\n        + (this.l || 0) * 100 + \"%\"\n        + (a === 1 ? \")\" : \", \" + a + \")\");\n  }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n  return (h < 60 ? m1 + (m2 - m1) * h / 60\n      : h < 180 ? m2\n      : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n      : m1) * 255;\n}\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval.js\";\n\nvar millisecond = interval(function() {\n  // noop\n}, function(date, step) {\n  date.setTime(+date + step);\n}, function(start, end) {\n  return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n  k = Math.floor(k);\n  if (!isFinite(k) || !(k > 0)) return null;\n  if (!(k > 1)) return millisecond;\n  return interval(function(date) {\n    date.setTime(Math.floor(date / k) * k);\n  }, function(date, step) {\n    date.setTime(+date + step * k);\n  }, function(start, end) {\n    return (end - start) / k;\n  });\n};\n\nexport default millisecond;\nexport var milliseconds = millisecond.range;\n","var t0 = new Date,\n    t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n  function interval(date) {\n    return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n  }\n\n  interval.floor = function(date) {\n    return floori(date = new Date(+date)), date;\n  };\n\n  interval.ceil = function(date) {\n    return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n  };\n\n  interval.round = function(date) {\n    var d0 = interval(date),\n        d1 = interval.ceil(date);\n    return date - d0 < d1 - date ? d0 : d1;\n  };\n\n  interval.offset = function(date, step) {\n    return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n  };\n\n  interval.range = function(start, stop, step) {\n    var range = [], previous;\n    start = interval.ceil(start);\n    step = step == null ? 1 : Math.floor(step);\n    if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n    do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n    while (previous < start && start < stop);\n    return range;\n  };\n\n  interval.filter = function(test) {\n    return newInterval(function(date) {\n      if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n    }, function(date, step) {\n      if (date >= date) {\n        if (step < 0) while (++step <= 0) {\n          while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n        } else while (--step >= 0) {\n          while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n        }\n      }\n    });\n  };\n\n  if (count) {\n    interval.count = function(start, end) {\n      t0.setTime(+start), t1.setTime(+end);\n      floori(t0), floori(t1);\n      return Math.floor(count(t0, t1));\n    };\n\n    interval.every = function(step) {\n      step = Math.floor(step);\n      return !isFinite(step) || !(step > 0) ? null\n          : !(step > 1) ? interval\n          : interval.filter(field\n              ? function(d) { return field(d) % step === 0; }\n              : function(d) { return interval.count(0, d) % step === 0; });\n    };\n  }\n\n  return interval;\n}\n","import interval from \"./interval.js\";\nimport {durationWeek} from \"./duration.js\";\n\nfunction utcWeekday(i) {\n  return interval(function(date) {\n    date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setUTCDate(date.getUTCDate() + step * 7);\n  }, function(start, end) {\n    return (end - start) / durationWeek;\n  });\n}\n\nexport var utcSunday = utcWeekday(0);\nexport var utcMonday = utcWeekday(1);\nexport var utcTuesday = utcWeekday(2);\nexport var utcWednesday = utcWeekday(3);\nexport var utcThursday = utcWeekday(4);\nexport var utcFriday = utcWeekday(5);\nexport var utcSaturday = utcWeekday(6);\n\nexport var utcSundays = utcSunday.range;\nexport var utcMondays = utcMonday.range;\nexport var utcTuesdays = utcTuesday.range;\nexport var utcWednesdays = utcWednesday.range;\nexport var utcThursdays = utcThursday.range;\nexport var utcFridays = utcFriday.range;\nexport var utcSaturdays = utcSaturday.range;\n","import interval from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nvar minute = interval(function(date) {\n  date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, function(date, step) {\n  date.setTime(+date + step * durationMinute);\n}, function(start, end) {\n  return (end - start) / durationMinute;\n}, function(date) {\n  return date.getMinutes();\n});\n\nexport default minute;\nexport var minutes = minute.range;\n","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.20';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim = /^\\s+|\\s+$/g,\n      reTrimStart = /^\\s+/,\n      reTrimEnd = /\\s+$/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = value.replace(reTrim, '');\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrim, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimEnd, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n","var EOL = {},\n    EOF = {},\n    QUOTE = 34,\n    NEWLINE = 10,\n    RETURN = 13;\n\nfunction objectConverter(columns) {\n  return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n    return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n  }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n  var object = objectConverter(columns);\n  return function(row, i) {\n    return f(object(row), i, columns);\n  };\n}\n\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n  var columnSet = Object.create(null),\n      columns = [];\n\n  rows.forEach(function(row) {\n    for (var column in row) {\n      if (!(column in columnSet)) {\n        columns.push(columnSet[column] = column);\n      }\n    }\n  });\n\n  return columns;\n}\n\nfunction pad(value, width) {\n  var s = value + \"\", length = s.length;\n  return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n  return year < 0 ? \"-\" + pad(-year, 6)\n    : year > 9999 ? \"+\" + pad(year, 6)\n    : pad(year, 4);\n}\n\nfunction formatDate(date) {\n  var hours = date.getUTCHours(),\n      minutes = date.getUTCMinutes(),\n      seconds = date.getUTCSeconds(),\n      milliseconds = date.getUTCMilliseconds();\n  return isNaN(date) ? \"Invalid Date\"\n      : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2)\n      + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\"\n      : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\"\n      : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\"\n      : \"\");\n}\n\nexport default function(delimiter) {\n  var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n      DELIMITER = delimiter.charCodeAt(0);\n\n  function parse(text, f) {\n    var convert, columns, rows = parseRows(text, function(row, i) {\n      if (convert) return convert(row, i - 1);\n      columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n    });\n    rows.columns = columns || [];\n    return rows;\n  }\n\n  function parseRows(text, f) {\n    var rows = [], // output rows\n        N = text.length,\n        I = 0, // current character index\n        n = 0, // current line number\n        t, // current token\n        eof = N <= 0, // current token followed by EOF?\n        eol = false; // current token followed by EOL?\n\n    // Strip the trailing newline.\n    if (text.charCodeAt(N - 1) === NEWLINE) --N;\n    if (text.charCodeAt(N - 1) === RETURN) --N;\n\n    function token() {\n      if (eof) return EOF;\n      if (eol) return eol = false, EOL;\n\n      // Unescape quotes.\n      var i, j = I, c;\n      if (text.charCodeAt(j) === QUOTE) {\n        while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n        if ((i = I) >= N) eof = true;\n        else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n        else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n        return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n      }\n\n      // Find next delimiter or newline.\n      while (I < N) {\n        if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n        else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }\n        else if (c !== DELIMITER) continue;\n        return text.slice(j, i);\n      }\n\n      // Return last token before EOF.\n      return eof = true, text.slice(j, N);\n    }\n\n    while ((t = token()) !== EOF) {\n      var row = [];\n      while (t !== EOL && t !== EOF) row.push(t), t = token();\n      if (f && (row = f(row, n++)) == null) continue;\n      rows.push(row);\n    }\n\n    return rows;\n  }\n\n  function preformatBody(rows, columns) {\n    return rows.map(function(row) {\n      return columns.map(function(column) {\n        return formatValue(row[column]);\n      }).join(delimiter);\n    });\n  }\n\n  function format(rows, columns) {\n    if (columns == null) columns = inferColumns(rows);\n    return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n  }\n\n  function formatBody(rows, columns) {\n    if (columns == null) columns = inferColumns(rows);\n    return preformatBody(rows, columns).join(\"\\n\");\n  }\n\n  function formatRows(rows) {\n    return rows.map(formatRow).join(\"\\n\");\n  }\n\n  function formatRow(row) {\n    return row.map(formatValue).join(delimiter);\n  }\n\n  function formatValue(value) {\n    return value == null ? \"\"\n        : value instanceof Date ? formatDate(value)\n        : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\"\n        : value;\n  }\n\n  return {\n    parse: parse,\n    parseRows: parseRows,\n    format: format,\n    formatBody: formatBody,\n    formatRows: formatRows,\n    formatRow: formatRow,\n    formatValue: formatValue\n  };\n}\n","import defaultView from \"../window\";\n\nfunction styleRemove(name) {\n  return function() {\n    this.style.removeProperty(name);\n  };\n}\n\nfunction styleConstant(name, value, priority) {\n  return function() {\n    this.style.setProperty(name, value, priority);\n  };\n}\n\nfunction styleFunction(name, value, priority) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) this.style.removeProperty(name);\n    else this.style.setProperty(name, v, priority);\n  };\n}\n\nexport default function(name, value, priority) {\n  return arguments.length > 1\n      ? this.each((value == null\n            ? styleRemove : typeof value === \"function\"\n            ? styleFunction\n            : styleConstant)(name, value, priority == null ? \"\" : priority))\n      : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n  return node.style.getPropertyValue(name)\n      || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n  var t = new Timer;\n  delay = delay == null ? 0 : +delay;\n  t.restart(function(elapsed) {\n    t.stop();\n    callback(elapsed + delay);\n  }, delay, time);\n  return t;\n}\n","function empty() {\n  return [];\n}\n\nexport default function(selector) {\n  return selector == null ? empty : function() {\n    return this.querySelectorAll(selector);\n  };\n}\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n  return x;\n}\n","import {slice} from \"./array\";\nimport identity from \"./identity\";\n\nvar top = 1,\n    right = 2,\n    bottom = 3,\n    left = 4,\n    epsilon = 1e-6;\n\nfunction translateX(x) {\n  return \"translate(\" + (x + 0.5) + \",0)\";\n}\n\nfunction translateY(y) {\n  return \"translate(0,\" + (y + 0.5) + \")\";\n}\n\nfunction number(scale) {\n  return function(d) {\n    return +scale(d);\n  };\n}\n\nfunction center(scale) {\n  var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.\n  if (scale.round()) offset = Math.round(offset);\n  return function(d) {\n    return +scale(d) + offset;\n  };\n}\n\nfunction entering() {\n  return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n  var tickArguments = [],\n      tickValues = null,\n      tickFormat = null,\n      tickSizeInner = 6,\n      tickSizeOuter = 6,\n      tickPadding = 3,\n      k = orient === top || orient === left ? -1 : 1,\n      x = orient === left || orient === right ? \"x\" : \"y\",\n      transform = orient === top || orient === bottom ? translateX : translateY;\n\n  function axis(context) {\n    var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n        format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n        spacing = Math.max(tickSizeInner, 0) + tickPadding,\n        range = scale.range(),\n        range0 = +range[0] + 0.5,\n        range1 = +range[range.length - 1] + 0.5,\n        position = (scale.bandwidth ? center : number)(scale.copy()),\n        selection = context.selection ? context.selection() : context,\n        path = selection.selectAll(\".domain\").data([null]),\n        tick = selection.selectAll(\".tick\").data(values, scale).order(),\n        tickExit = tick.exit(),\n        tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n        line = tick.select(\"line\"),\n        text = tick.select(\"text\");\n\n    path = path.merge(path.enter().insert(\"path\", \".tick\")\n        .attr(\"class\", \"domain\")\n        .attr(\"stroke\", \"currentColor\"));\n\n    tick = tick.merge(tickEnter);\n\n    line = line.merge(tickEnter.append(\"line\")\n        .attr(\"stroke\", \"currentColor\")\n        .attr(x + \"2\", k * tickSizeInner));\n\n    text = text.merge(tickEnter.append(\"text\")\n        .attr(\"fill\", \"currentColor\")\n        .attr(x, k * spacing)\n        .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n    if (context !== selection) {\n      path = path.transition(context);\n      tick = tick.transition(context);\n      line = line.transition(context);\n      text = text.transition(context);\n\n      tickExit = tickExit.transition(context)\n          .attr(\"opacity\", epsilon)\n          .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute(\"transform\"); });\n\n      tickEnter\n          .attr(\"opacity\", epsilon)\n          .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });\n    }\n\n    tickExit.remove();\n\n    path\n        .attr(\"d\", orient === left || orient == right\n            ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H0.5V\" + range1 + \"H\" + k * tickSizeOuter : \"M0.5,\" + range0 + \"V\" + range1)\n            : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V0.5H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",0.5H\" + range1));\n\n    tick\n        .attr(\"opacity\", 1)\n        .attr(\"transform\", function(d) { return transform(position(d)); });\n\n    line\n        .attr(x + \"2\", k * tickSizeInner);\n\n    text\n        .attr(x, k * spacing)\n        .text(format);\n\n    selection.filter(entering)\n        .attr(\"fill\", \"none\")\n        .attr(\"font-size\", 10)\n        .attr(\"font-family\", \"sans-serif\")\n        .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n    selection\n        .each(function() { this.__axis = position; });\n  }\n\n  axis.scale = function(_) {\n    return arguments.length ? (scale = _, axis) : scale;\n  };\n\n  axis.ticks = function() {\n    return tickArguments = slice.call(arguments), axis;\n  };\n\n  axis.tickArguments = function(_) {\n    return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice();\n  };\n\n  axis.tickValues = function(_) {\n    return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice();\n  };\n\n  axis.tickFormat = function(_) {\n    return arguments.length ? (tickFormat = _, axis) : tickFormat;\n  };\n\n  axis.tickSize = function(_) {\n    return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n  };\n\n  axis.tickSizeInner = function(_) {\n    return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n  };\n\n  axis.tickSizeOuter = function(_) {\n    return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n  };\n\n  axis.tickPadding = function(_) {\n    return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n  };\n\n  return axis;\n}\n\nexport function axisTop(scale) {\n  return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n  return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n  return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n  return axis(left, scale);\n}\n","import {event} from \"./selection/on\";\n\nexport default function() {\n  var current = event, source;\n  while (source = current.sourceEvent) current = source;\n  return current;\n}\n","import {\n  timeDay,\n  timeSunday,\n  timeMonday,\n  timeThursday,\n  timeYear,\n  utcDay,\n  utcSunday,\n  utcMonday,\n  utcThursday,\n  utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n    date.setFullYear(d.y);\n    return date;\n  }\n  return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n    date.setUTCFullYear(d.y);\n    return date;\n  }\n  return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n  return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n  var locale_dateTime = locale.dateTime,\n      locale_date = locale.date,\n      locale_time = locale.time,\n      locale_periods = locale.periods,\n      locale_weekdays = locale.days,\n      locale_shortWeekdays = locale.shortDays,\n      locale_months = locale.months,\n      locale_shortMonths = locale.shortMonths;\n\n  var periodRe = formatRe(locale_periods),\n      periodLookup = formatLookup(locale_periods),\n      weekdayRe = formatRe(locale_weekdays),\n      weekdayLookup = formatLookup(locale_weekdays),\n      shortWeekdayRe = formatRe(locale_shortWeekdays),\n      shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n      monthRe = formatRe(locale_months),\n      monthLookup = formatLookup(locale_months),\n      shortMonthRe = formatRe(locale_shortMonths),\n      shortMonthLookup = formatLookup(locale_shortMonths);\n\n  var formats = {\n    \"a\": formatShortWeekday,\n    \"A\": formatWeekday,\n    \"b\": formatShortMonth,\n    \"B\": formatMonth,\n    \"c\": null,\n    \"d\": formatDayOfMonth,\n    \"e\": formatDayOfMonth,\n    \"f\": formatMicroseconds,\n    \"H\": formatHour24,\n    \"I\": formatHour12,\n    \"j\": formatDayOfYear,\n    \"L\": formatMilliseconds,\n    \"m\": formatMonthNumber,\n    \"M\": formatMinutes,\n    \"p\": formatPeriod,\n    \"q\": formatQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatSeconds,\n    \"u\": formatWeekdayNumberMonday,\n    \"U\": formatWeekNumberSunday,\n    \"V\": formatWeekNumberISO,\n    \"w\": formatWeekdayNumberSunday,\n    \"W\": formatWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatYear,\n    \"Y\": formatFullYear,\n    \"Z\": formatZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var utcFormats = {\n    \"a\": formatUTCShortWeekday,\n    \"A\": formatUTCWeekday,\n    \"b\": formatUTCShortMonth,\n    \"B\": formatUTCMonth,\n    \"c\": null,\n    \"d\": formatUTCDayOfMonth,\n    \"e\": formatUTCDayOfMonth,\n    \"f\": formatUTCMicroseconds,\n    \"H\": formatUTCHour24,\n    \"I\": formatUTCHour12,\n    \"j\": formatUTCDayOfYear,\n    \"L\": formatUTCMilliseconds,\n    \"m\": formatUTCMonthNumber,\n    \"M\": formatUTCMinutes,\n    \"p\": formatUTCPeriod,\n    \"q\": formatUTCQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatUTCSeconds,\n    \"u\": formatUTCWeekdayNumberMonday,\n    \"U\": formatUTCWeekNumberSunday,\n    \"V\": formatUTCWeekNumberISO,\n    \"w\": formatUTCWeekdayNumberSunday,\n    \"W\": formatUTCWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatUTCYear,\n    \"Y\": formatUTCFullYear,\n    \"Z\": formatUTCZone,\n    \"%\": formatLiteralPercent\n  };\n\n  var parses = {\n    \"a\": parseShortWeekday,\n    \"A\": parseWeekday,\n    \"b\": parseShortMonth,\n    \"B\": parseMonth,\n    \"c\": parseLocaleDateTime,\n    \"d\": parseDayOfMonth,\n    \"e\": parseDayOfMonth,\n    \"f\": parseMicroseconds,\n    \"H\": parseHour24,\n    \"I\": parseHour24,\n    \"j\": parseDayOfYear,\n    \"L\": parseMilliseconds,\n    \"m\": parseMonthNumber,\n    \"M\": parseMinutes,\n    \"p\": parsePeriod,\n    \"q\": parseQuarter,\n    \"Q\": parseUnixTimestamp,\n    \"s\": parseUnixTimestampSeconds,\n    \"S\": parseSeconds,\n    \"u\": parseWeekdayNumberMonday,\n    \"U\": parseWeekNumberSunday,\n    \"V\": parseWeekNumberISO,\n    \"w\": parseWeekdayNumberSunday,\n    \"W\": parseWeekNumberMonday,\n    \"x\": parseLocaleDate,\n    \"X\": parseLocaleTime,\n    \"y\": parseYear,\n    \"Y\": parseFullYear,\n    \"Z\": parseZone,\n    \"%\": parseLiteralPercent\n  };\n\n  // These recursive directive definitions must be deferred.\n  formats.x = newFormat(locale_date, formats);\n  formats.X = newFormat(locale_time, formats);\n  formats.c = newFormat(locale_dateTime, formats);\n  utcFormats.x = newFormat(locale_date, utcFormats);\n  utcFormats.X = newFormat(locale_time, utcFormats);\n  utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n  function newFormat(specifier, formats) {\n    return function(date) {\n      var string = [],\n          i = -1,\n          j = 0,\n          n = specifier.length,\n          c,\n          pad,\n          format;\n\n      if (!(date instanceof Date)) date = new Date(+date);\n\n      while (++i < n) {\n        if (specifier.charCodeAt(i) === 37) {\n          string.push(specifier.slice(j, i));\n          if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n          else pad = c === \"e\" ? \" \" : \"0\";\n          if (format = formats[c]) c = format(date, pad);\n          string.push(c);\n          j = i + 1;\n        }\n      }\n\n      string.push(specifier.slice(j, i));\n      return string.join(\"\");\n    };\n  }\n\n  function newParse(specifier, Z) {\n    return function(string) {\n      var d = newDate(1900, undefined, 1),\n          i = parseSpecifier(d, specifier, string += \"\", 0),\n          week, day;\n      if (i != string.length) return null;\n\n      // If a UNIX timestamp is specified, return it.\n      if (\"Q\" in d) return new Date(d.Q);\n      if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n      // If this is utcParse, never use the local timezone.\n      if (Z && !(\"Z\" in d)) d.Z = 0;\n\n      // The am-pm flag is 0 for AM, and 1 for PM.\n      if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n      // If the month was not specified, inherit from the quarter.\n      if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n      // Convert day-of-week and week-of-year to day-of-year.\n      if (\"V\" in d) {\n        if (d.V < 1 || d.V > 53) return null;\n        if (!(\"w\" in d)) d.w = 1;\n        if (\"Z\" in d) {\n          week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n          week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n          week = utcDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getUTCFullYear();\n          d.m = week.getUTCMonth();\n          d.d = week.getUTCDate() + (d.w + 6) % 7;\n        } else {\n          week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n          week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n          week = timeDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getFullYear();\n          d.m = week.getMonth();\n          d.d = week.getDate() + (d.w + 6) % 7;\n        }\n      } else if (\"W\" in d || \"U\" in d) {\n        if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n        day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n        d.m = 0;\n        d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n      }\n\n      // If a time zone is specified, all fields are interpreted as UTC and then\n      // offset according to the specified time zone.\n      if (\"Z\" in d) {\n        d.H += d.Z / 100 | 0;\n        d.M += d.Z % 100;\n        return utcDate(d);\n      }\n\n      // Otherwise, all fields are in local time.\n      return localDate(d);\n    };\n  }\n\n  function parseSpecifier(d, specifier, string, j) {\n    var i = 0,\n        n = specifier.length,\n        m = string.length,\n        c,\n        parse;\n\n    while (i < n) {\n      if (j >= m) return -1;\n      c = specifier.charCodeAt(i++);\n      if (c === 37) {\n        c = specifier.charAt(i++);\n        parse = parses[c in pads ? specifier.charAt(i++) : c];\n        if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n      } else if (c != string.charCodeAt(j++)) {\n        return -1;\n      }\n    }\n\n    return j;\n  }\n\n  function parsePeriod(d, string, i) {\n    var n = periodRe.exec(string.slice(i));\n    return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortWeekday(d, string, i) {\n    var n = shortWeekdayRe.exec(string.slice(i));\n    return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseWeekday(d, string, i) {\n    var n = weekdayRe.exec(string.slice(i));\n    return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortMonth(d, string, i) {\n    var n = shortMonthRe.exec(string.slice(i));\n    return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseMonth(d, string, i) {\n    var n = monthRe.exec(string.slice(i));\n    return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseLocaleDateTime(d, string, i) {\n    return parseSpecifier(d, locale_dateTime, string, i);\n  }\n\n  function parseLocaleDate(d, string, i) {\n    return parseSpecifier(d, locale_date, string, i);\n  }\n\n  function parseLocaleTime(d, string, i) {\n    return parseSpecifier(d, locale_time, string, i);\n  }\n\n  function formatShortWeekday(d) {\n    return locale_shortWeekdays[d.getDay()];\n  }\n\n  function formatWeekday(d) {\n    return locale_weekdays[d.getDay()];\n  }\n\n  function formatShortMonth(d) {\n    return locale_shortMonths[d.getMonth()];\n  }\n\n  function formatMonth(d) {\n    return locale_months[d.getMonth()];\n  }\n\n  function formatPeriod(d) {\n    return locale_periods[+(d.getHours() >= 12)];\n  }\n\n  function formatQuarter(d) {\n    return 1 + ~~(d.getMonth() / 3);\n  }\n\n  function formatUTCShortWeekday(d) {\n    return locale_shortWeekdays[d.getUTCDay()];\n  }\n\n  function formatUTCWeekday(d) {\n    return locale_weekdays[d.getUTCDay()];\n  }\n\n  function formatUTCShortMonth(d) {\n    return locale_shortMonths[d.getUTCMonth()];\n  }\n\n  function formatUTCMonth(d) {\n    return locale_months[d.getUTCMonth()];\n  }\n\n  function formatUTCPeriod(d) {\n    return locale_periods[+(d.getUTCHours() >= 12)];\n  }\n\n  function formatUTCQuarter(d) {\n    return 1 + ~~(d.getUTCMonth() / 3);\n  }\n\n  return {\n    format: function(specifier) {\n      var f = newFormat(specifier += \"\", formats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    parse: function(specifier) {\n      var p = newParse(specifier += \"\", false);\n      p.toString = function() { return specifier; };\n      return p;\n    },\n    utcFormat: function(specifier) {\n      var f = newFormat(specifier += \"\", utcFormats);\n      f.toString = function() { return specifier; };\n      return f;\n    },\n    utcParse: function(specifier) {\n      var p = newParse(specifier += \"\", true);\n      p.toString = function() { return specifier; };\n      return p;\n    }\n  };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n    numberRe = /^\\s*\\d+/, // note: ignores next directive\n    percentRe = /^%/,\n    requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n  var sign = value < 0 ? \"-\" : \"\",\n      string = (sign ? -value : value) + \"\",\n      length = string.length;\n  return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n  return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n  return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n  var map = {}, i = -1, n = names.length;\n  while (++i < n) map[names[i].toLowerCase()] = i;\n  return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 4));\n  return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n  var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n  return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 6));\n  return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n  var n = percentRe.exec(string.slice(i, i + 1));\n  return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n  return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n  return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n  return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n  return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n  return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n  return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n  return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n  return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n  return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n  var day = d.getDay();\n  return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n  return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n  var day = d.getDay();\n  d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n  return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n  return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n  return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n  return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n  return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n  var z = d.getTimezoneOffset();\n  return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n      + pad(z / 60 | 0, \"0\", 2)\n      + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n  return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n  return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n  return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n  return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n  return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n  return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n  return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n  return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n  return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n  var dow = d.getUTCDay();\n  return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n  return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n  var day = d.getUTCDay();\n  d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n  return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n  return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n  return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n  return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n  return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n  return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n  return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n  return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n  return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n  dateTime: \"%x, %X\",\n  date: \"%-m/%-d/%Y\",\n  time: \"%-I:%M:%S %p\",\n  periods: [\"AM\", \"PM\"],\n  days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n  shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n  shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n  locale = formatLocale(definition);\n  timeFormat = locale.format;\n  timeParse = locale.parse;\n  utcFormat = locale.utcFormat;\n  utcParse = locale.utcParse;\n  return locale;\n}\n","import namespace from \"./namespace\";\nimport {xhtml} from \"./namespaces\";\n\nfunction creatorInherit(name) {\n  return function() {\n    var document = this.ownerDocument,\n        uri = this.namespaceURI;\n    return uri === xhtml && document.documentElement.namespaceURI === xhtml\n        ? document.createElement(name)\n        : document.createElementNS(uri, name);\n  };\n}\n\nfunction creatorFixed(fullname) {\n  return function() {\n    return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n  };\n}\n\nexport default function(name) {\n  var fullname = namespace(name);\n  return (fullname.local\n      ? creatorFixed\n      : creatorInherit)(fullname);\n}\n","import interval from \"./interval.js\";\n\nvar utcMonth = interval(function(date) {\n  date.setUTCDate(1);\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n  return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n  return date.getUTCMonth();\n});\n\nexport default utcMonth;\nexport var utcMonths = utcMonth.range;\n","import dsv from \"./dsv.js\";\n\nvar csv = dsv(\",\");\n\nexport var csvParse = csv.parse;\nexport var csvParseRows = csv.parseRows;\nexport var csvFormat = csv.format;\nexport var csvFormatBody = csv.formatBody;\nexport var csvFormatRows = csv.formatRows;\nexport var csvFormatRow = csv.formatRow;\nexport var csvFormatValue = csv.formatValue;\n","export var name = \"d3\";\nexport var version = \"5.15.0\";\nexport var description = \"Data-Driven Documents\";\nexport var keywords = [\"dom\",\"visualization\",\"svg\",\"animation\",\"canvas\"];\nexport var homepage = \"https://d3js.org\";\nexport var license = \"BSD-3-Clause\";\nexport var author = {\"name\":\"Mike Bostock\",\"url\":\"https://bost.ocks.org/mike\"};\nexport var main = \"dist/d3.node.js\";\nexport var unpkg = \"dist/d3.min.js\";\nexport var jsdelivr = \"dist/d3.min.js\";\nexport var module = \"index.js\";\nexport var repository = {\"type\":\"git\",\"url\":\"https://github.com/d3/d3.git\"};\nexport var files = [\"dist/**/*.js\",\"index.js\"];\nexport var scripts = {\"pretest\":\"rimraf dist && mkdir dist && json2module package.json > dist/package.js && rollup -c\",\"test\":\"tape 'test/**/*-test.js'\",\"prepublishOnly\":\"yarn test\",\"postpublish\":\"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v5.js && cp ../d3/dist/d3.min.js d3.v5.min.js && git add d3.v5.js d3.v5.min.js && git commit -m \\\"d3 ${npm_package_version}\\\" && git push && cd - && cd ../d3-bower && git pull && cp ../d3/LICENSE ../d3/README.md ../d3/dist/d3.js ../d3/dist/d3.min.js . && git add -- LICENSE README.md d3.js d3.min.js && git commit -m \\\"${npm_package_version}\\\" && git tag -am \\\"${npm_package_version}\\\" v${npm_package_version} && git push && git push --tags && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js\"};\nexport var devDependencies = {\"json2module\":\"0.0\",\"rimraf\":\"2\",\"rollup\":\"1\",\"rollup-plugin-ascii\":\"0.0\",\"rollup-plugin-node-resolve\":\"3\",\"rollup-plugin-terser\":\"5\",\"tape\":\"4\"};\nexport var dependencies = {\"d3-array\":\"1\",\"d3-axis\":\"1\",\"d3-brush\":\"1\",\"d3-chord\":\"1\",\"d3-collection\":\"1\",\"d3-color\":\"1\",\"d3-contour\":\"1\",\"d3-dispatch\":\"1\",\"d3-drag\":\"1\",\"d3-dsv\":\"1\",\"d3-ease\":\"1\",\"d3-fetch\":\"1\",\"d3-force\":\"1\",\"d3-format\":\"1\",\"d3-geo\":\"1\",\"d3-hierarchy\":\"1\",\"d3-interpolate\":\"1\",\"d3-path\":\"1\",\"d3-polygon\":\"1\",\"d3-quadtree\":\"1\",\"d3-random\":\"1\",\"d3-scale\":\"2\",\"d3-scale-chromatic\":\"1\",\"d3-selection\":\"1\",\"d3-shape\":\"1\",\"d3-time\":\"1\",\"d3-time-format\":\"2\",\"d3-timer\":\"1\",\"d3-transition\":\"1\",\"d3-voronoi\":\"1\",\"d3-zoom\":\"1\"};\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {customEvent, event, touch, mouse, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n    MODE_SPACE = {name: \"space\"},\n    MODE_HANDLE = {name: \"handle\"},\n    MODE_CENTER = {name: \"center\"};\n\nfunction number1(e) {\n  return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n  return [number1(e[0]), number1(e[1])];\n}\n\nfunction toucher(identifier) {\n  return function(target) {\n    return touch(target, event.touches, identifier);\n  };\n}\n\nvar X = {\n  name: \"x\",\n  handles: [\"w\", \"e\"].map(type),\n  input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n  output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n  name: \"y\",\n  handles: [\"n\", \"s\"].map(type),\n  input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n  output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n  name: \"xy\",\n  handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n  input: function(xy) { return xy == null ? null : number2(xy); },\n  output: function(xy) { return xy; }\n};\n\nvar cursors = {\n  overlay: \"crosshair\",\n  selection: \"move\",\n  n: \"ns-resize\",\n  e: \"ew-resize\",\n  s: \"ns-resize\",\n  w: \"ew-resize\",\n  nw: \"nwse-resize\",\n  ne: \"nesw-resize\",\n  se: \"nwse-resize\",\n  sw: \"nesw-resize\"\n};\n\nvar flipX = {\n  e: \"w\",\n  w: \"e\",\n  nw: \"ne\",\n  ne: \"nw\",\n  se: \"sw\",\n  sw: \"se\"\n};\n\nvar flipY = {\n  n: \"s\",\n  s: \"n\",\n  nw: \"sw\",\n  ne: \"se\",\n  se: \"ne\",\n  sw: \"nw\"\n};\n\nvar signsX = {\n  overlay: +1,\n  selection: +1,\n  n: null,\n  e: +1,\n  s: null,\n  w: -1,\n  nw: -1,\n  ne: +1,\n  se: +1,\n  sw: -1\n};\n\nvar signsY = {\n  overlay: +1,\n  selection: +1,\n  n: -1,\n  e: null,\n  s: +1,\n  w: null,\n  nw: -1,\n  ne: -1,\n  se: +1,\n  sw: +1\n};\n\nfunction type(t) {\n  return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter() {\n  return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n  var svg = this.ownerSVGElement || this;\n  if (svg.hasAttribute(\"viewBox\")) {\n    svg = svg.viewBox.baseVal;\n    return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n  }\n  return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n  return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name “__brush” rather than auto-generated.\nfunction local(node) {\n  while (!node.__brush) if (!(node = node.parentNode)) return;\n  return node.__brush;\n}\n\nfunction empty(extent) {\n  return extent[0][0] === extent[1][0]\n      || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n  var state = node.__brush;\n  return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n  return brush(X);\n}\n\nexport function brushY() {\n  return brush(Y);\n}\n\nexport default function() {\n  return brush(XY);\n}\n\nfunction brush(dim) {\n  var extent = defaultExtent,\n      filter = defaultFilter,\n      touchable = defaultTouchable,\n      keys = true,\n      listeners = dispatch(\"start\", \"brush\", \"end\"),\n      handleSize = 6,\n      touchending;\n\n  function brush(group) {\n    var overlay = group\n        .property(\"__brush\", initialize)\n      .selectAll(\".overlay\")\n      .data([type(\"overlay\")]);\n\n    overlay.enter().append(\"rect\")\n        .attr(\"class\", \"overlay\")\n        .attr(\"pointer-events\", \"all\")\n        .attr(\"cursor\", cursors.overlay)\n      .merge(overlay)\n        .each(function() {\n          var extent = local(this).extent;\n          select(this)\n              .attr(\"x\", extent[0][0])\n              .attr(\"y\", extent[0][1])\n              .attr(\"width\", extent[1][0] - extent[0][0])\n              .attr(\"height\", extent[1][1] - extent[0][1]);\n        });\n\n    group.selectAll(\".selection\")\n      .data([type(\"selection\")])\n      .enter().append(\"rect\")\n        .attr(\"class\", \"selection\")\n        .attr(\"cursor\", cursors.selection)\n        .attr(\"fill\", \"#777\")\n        .attr(\"fill-opacity\", 0.3)\n        .attr(\"stroke\", \"#fff\")\n        .attr(\"shape-rendering\", \"crispEdges\");\n\n    var handle = group.selectAll(\".handle\")\n      .data(dim.handles, function(d) { return d.type; });\n\n    handle.exit().remove();\n\n    handle.enter().append(\"rect\")\n        .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n        .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n    group\n        .each(redraw)\n        .attr(\"fill\", \"none\")\n        .attr(\"pointer-events\", \"all\")\n        .on(\"mousedown.brush\", started)\n      .filter(touchable)\n        .on(\"touchstart.brush\", started)\n        .on(\"touchmove.brush\", touchmoved)\n        .on(\"touchend.brush touchcancel.brush\", touchended)\n        .style(\"touch-action\", \"none\")\n        .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n  }\n\n  brush.move = function(group, selection) {\n    if (group.selection) {\n      group\n          .on(\"start.brush\", function() { emitter(this, arguments).beforestart().start(); })\n          .on(\"interrupt.brush end.brush\", function() { emitter(this, arguments).end(); })\n          .tween(\"brush\", function() {\n            var that = this,\n                state = that.__brush,\n                emit = emitter(that, arguments),\n                selection0 = state.selection,\n                selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n                i = interpolate(selection0, selection1);\n\n            function tween(t) {\n              state.selection = t === 1 && selection1 === null ? null : i(t);\n              redraw.call(that);\n              emit.brush();\n            }\n\n            return selection0 !== null && selection1 !== null ? tween : tween(1);\n          });\n    } else {\n      group\n          .each(function() {\n            var that = this,\n                args = arguments,\n                state = that.__brush,\n                selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n                emit = emitter(that, args).beforestart();\n\n            interrupt(that);\n            state.selection = selection1 === null ? null : selection1;\n            redraw.call(that);\n            emit.start().brush().end();\n          });\n    }\n  };\n\n  brush.clear = function(group) {\n    brush.move(group, null);\n  };\n\n  function redraw() {\n    var group = select(this),\n        selection = local(this).selection;\n\n    if (selection) {\n      group.selectAll(\".selection\")\n          .style(\"display\", null)\n          .attr(\"x\", selection[0][0])\n          .attr(\"y\", selection[0][1])\n          .attr(\"width\", selection[1][0] - selection[0][0])\n          .attr(\"height\", selection[1][1] - selection[0][1]);\n\n      group.selectAll(\".handle\")\n          .style(\"display\", null)\n          .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n          .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n          .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n          .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n    }\n\n    else {\n      group.selectAll(\".selection,.handle\")\n          .style(\"display\", \"none\")\n          .attr(\"x\", null)\n          .attr(\"y\", null)\n          .attr(\"width\", null)\n          .attr(\"height\", null);\n    }\n  }\n\n  function emitter(that, args, clean) {\n    return (!clean && that.__brush.emitter) || new Emitter(that, args);\n  }\n\n  function Emitter(that, args) {\n    this.that = that;\n    this.args = args;\n    this.state = that.__brush;\n    this.active = 0;\n  }\n\n  Emitter.prototype = {\n    beforestart: function() {\n      if (++this.active === 1) this.state.emitter = this, this.starting = true;\n      return this;\n    },\n    start: function() {\n      if (this.starting) this.starting = false, this.emit(\"start\");\n      else this.emit(\"brush\");\n      return this;\n    },\n    brush: function() {\n      this.emit(\"brush\");\n      return this;\n    },\n    end: function() {\n      if (--this.active === 0) delete this.state.emitter, this.emit(\"end\");\n      return this;\n    },\n    emit: function(type) {\n      customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);\n    }\n  };\n\n  function started() {\n    if (touchending && !event.touches) return;\n    if (!filter.apply(this, arguments)) return;\n\n    var that = this,\n        type = event.target.__data__.type,\n        mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n        signX = dim === Y ? null : signsX[type],\n        signY = dim === X ? null : signsY[type],\n        state = local(that),\n        extent = state.extent,\n        selection = state.selection,\n        W = extent[0][0], w0, w1,\n        N = extent[0][1], n0, n1,\n        E = extent[1][0], e0, e1,\n        S = extent[1][1], s0, s1,\n        dx = 0,\n        dy = 0,\n        moving,\n        shifting = signX && signY && keys && event.shiftKey,\n        lockX,\n        lockY,\n        pointer = event.touches ? toucher(event.changedTouches[0].identifier) : mouse,\n        point0 = pointer(that),\n        point = point0,\n        emit = emitter(that, arguments, true).beforestart();\n\n    if (type === \"overlay\") {\n      if (selection) moving = true;\n      state.selection = selection = [\n        [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],\n        [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]\n      ];\n    } else {\n      w0 = selection[0][0];\n      n0 = selection[0][1];\n      e0 = selection[1][0];\n      s0 = selection[1][1];\n    }\n\n    w1 = w0;\n    n1 = n0;\n    e1 = e0;\n    s1 = s0;\n\n    var group = select(that)\n        .attr(\"pointer-events\", \"none\");\n\n    var overlay = group.selectAll(\".overlay\")\n        .attr(\"cursor\", cursors[type]);\n\n    if (event.touches) {\n      emit.moved = moved;\n      emit.ended = ended;\n    } else {\n      var view = select(event.view)\n          .on(\"mousemove.brush\", moved, true)\n          .on(\"mouseup.brush\", ended, true);\n      if (keys) view\n          .on(\"keydown.brush\", keydowned, true)\n          .on(\"keyup.brush\", keyupped, true)\n\n      dragDisable(event.view);\n    }\n\n    nopropagation();\n    interrupt(that);\n    redraw.call(that);\n    emit.start();\n\n    function moved() {\n      var point1 = pointer(that);\n      if (shifting && !lockX && !lockY) {\n        if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;\n        else lockX = true;\n      }\n      point = point1;\n      moving = true;\n      noevent();\n      move();\n    }\n\n    function move() {\n      var t;\n\n      dx = point[0] - point0[0];\n      dy = point[1] - point0[1];\n\n      switch (mode) {\n        case MODE_SPACE:\n        case MODE_DRAG: {\n          if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n          if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n          break;\n        }\n        case MODE_HANDLE: {\n          if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n          else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n          if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n          else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n          break;\n        }\n        case MODE_CENTER: {\n          if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));\n          if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));\n          break;\n        }\n      }\n\n      if (e1 < w1) {\n        signX *= -1;\n        t = w0, w0 = e0, e0 = t;\n        t = w1, w1 = e1, e1 = t;\n        if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n      }\n\n      if (s1 < n1) {\n        signY *= -1;\n        t = n0, n0 = s0, s0 = t;\n        t = n1, n1 = s1, s1 = t;\n        if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n      }\n\n      if (state.selection) selection = state.selection; // May be set by brush.move!\n      if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n      if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n      if (selection[0][0] !== w1\n          || selection[0][1] !== n1\n          || selection[1][0] !== e1\n          || selection[1][1] !== s1) {\n        state.selection = [[w1, n1], [e1, s1]];\n        redraw.call(that);\n        emit.brush();\n      }\n    }\n\n    function ended() {\n      nopropagation();\n      if (event.touches) {\n        if (event.touches.length) return;\n        if (touchending) clearTimeout(touchending);\n        touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n      } else {\n        dragEnable(event.view, moving);\n        view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n      }\n      group.attr(\"pointer-events\", \"all\");\n      overlay.attr(\"cursor\", cursors.overlay);\n      if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n      if (empty(selection)) state.selection = null, redraw.call(that);\n      emit.end();\n    }\n\n    function keydowned() {\n      switch (event.keyCode) {\n        case 16: { // SHIFT\n          shifting = signX && signY;\n          break;\n        }\n        case 18: { // ALT\n          if (mode === MODE_HANDLE) {\n            if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n            if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n            mode = MODE_CENTER;\n            move();\n          }\n          break;\n        }\n        case 32: { // SPACE; takes priority over ALT\n          if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n            if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n            if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n            mode = MODE_SPACE;\n            overlay.attr(\"cursor\", cursors.selection);\n            move();\n          }\n          break;\n        }\n        default: return;\n      }\n      noevent();\n    }\n\n    function keyupped() {\n      switch (event.keyCode) {\n        case 16: { // SHIFT\n          if (shifting) {\n            lockX = lockY = shifting = false;\n            move();\n          }\n          break;\n        }\n        case 18: { // ALT\n          if (mode === MODE_CENTER) {\n            if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n            if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n            mode = MODE_HANDLE;\n            move();\n          }\n          break;\n        }\n        case 32: { // SPACE\n          if (mode === MODE_SPACE) {\n            if (event.altKey) {\n              if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n              if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n              mode = MODE_CENTER;\n            } else {\n              if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n              if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n              mode = MODE_HANDLE;\n            }\n            overlay.attr(\"cursor\", cursors[type]);\n            move();\n          }\n          break;\n        }\n        default: return;\n      }\n      noevent();\n    }\n  }\n\n  function touchmoved() {\n    emitter(this, arguments).moved();\n  }\n\n  function touchended() {\n    emitter(this, arguments).ended();\n  }\n\n  function initialize() {\n    var state = this.__brush || {selection: null};\n    state.extent = number2(extent.apply(this, arguments));\n    state.dim = dim;\n    return state;\n  }\n\n  brush.extent = function(_) {\n    return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n  };\n\n  brush.filter = function(_) {\n    return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n  };\n\n  brush.touchable = function(_) {\n    return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n  };\n\n  brush.handleSize = function(_) {\n    return arguments.length ? (handleSize = +_, brush) : handleSize;\n  };\n\n  brush.keyModifiers = function(_) {\n    return arguments.length ? (keys = !!_, brush) : keys;\n  };\n\n  brush.on = function() {\n    var value = listeners.on.apply(listeners, arguments);\n    return value === listeners ? brush : value;\n  };\n\n  return brush;\n}\n","export var cos = Math.cos;\nexport var sin = Math.sin;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = pi * 2;\nexport var max = Math.max;\n","export var slice = Array.prototype.slice;\n","import {range} from \"d3-array\";\nimport {max, tau} from \"./math\";\n\nfunction compareValue(compare) {\n  return function(a, b) {\n    return compare(\n      a.source.value + a.target.value,\n      b.source.value + b.target.value\n    );\n  };\n}\n\nexport default function() {\n  var padAngle = 0,\n      sortGroups = null,\n      sortSubgroups = null,\n      sortChords = null;\n\n  function chord(matrix) {\n    var n = matrix.length,\n        groupSums = [],\n        groupIndex = range(n),\n        subgroupIndex = [],\n        chords = [],\n        groups = chords.groups = new Array(n),\n        subgroups = new Array(n * n),\n        k,\n        x,\n        x0,\n        dx,\n        i,\n        j;\n\n    // Compute the sum.\n    k = 0, i = -1; while (++i < n) {\n      x = 0, j = -1; while (++j < n) {\n        x += matrix[i][j];\n      }\n      groupSums.push(x);\n      subgroupIndex.push(range(n));\n      k += x;\n    }\n\n    // Sort groups…\n    if (sortGroups) groupIndex.sort(function(a, b) {\n      return sortGroups(groupSums[a], groupSums[b]);\n    });\n\n    // Sort subgroups…\n    if (sortSubgroups) subgroupIndex.forEach(function(d, i) {\n      d.sort(function(a, b) {\n        return sortSubgroups(matrix[i][a], matrix[i][b]);\n      });\n    });\n\n    // Convert the sum to scaling factor for [0, 2pi].\n    // TODO Allow start and end angle to be specified?\n    // TODO Allow padding to be specified as percentage?\n    k = max(0, tau - padAngle * n) / k;\n    dx = k ? padAngle : tau / n;\n\n    // Compute the start and end angle for each group and subgroup.\n    // Note: Opera has a bug reordering object literal properties!\n    x = 0, i = -1; while (++i < n) {\n      x0 = x, j = -1; while (++j < n) {\n        var di = groupIndex[i],\n            dj = subgroupIndex[di][j],\n            v = matrix[di][dj],\n            a0 = x,\n            a1 = x += v * k;\n        subgroups[dj * n + di] = {\n          index: di,\n          subindex: dj,\n          startAngle: a0,\n          endAngle: a1,\n          value: v\n        };\n      }\n      groups[di] = {\n        index: di,\n        startAngle: x0,\n        endAngle: x,\n        value: groupSums[di]\n      };\n      x += dx;\n    }\n\n    // Generate chords for each (non-empty) subgroup-subgroup link.\n    i = -1; while (++i < n) {\n      j = i - 1; while (++j < n) {\n        var source = subgroups[j * n + i],\n            target = subgroups[i * n + j];\n        if (source.value || target.value) {\n          chords.push(source.value < target.value\n              ? {source: target, target: source}\n              : {source: source, target: target});\n        }\n      }\n    }\n\n    return sortChords ? chords.sort(sortChords) : chords;\n  }\n\n  chord.padAngle = function(_) {\n    return arguments.length ? (padAngle = max(0, _), chord) : padAngle;\n  };\n\n  chord.sortGroups = function(_) {\n    return arguments.length ? (sortGroups = _, chord) : sortGroups;\n  };\n\n  chord.sortSubgroups = function(_) {\n    return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;\n  };\n\n  chord.sortChords = function(_) {\n    return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;\n  };\n\n  return chord;\n}\n","var pi = Math.PI,\n    tau = 2 * pi,\n    epsilon = 1e-6,\n    tauEpsilon = tau - epsilon;\n\nfunction Path() {\n  this._x0 = this._y0 = // start of current subpath\n  this._x1 = this._y1 = null; // end of current subpath\n  this._ = \"\";\n}\n\nfunction path() {\n  return new Path;\n}\n\nPath.prototype = path.prototype = {\n  constructor: Path,\n  moveTo: function(x, y) {\n    this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n  },\n  closePath: function() {\n    if (this._x1 !== null) {\n      this._x1 = this._x0, this._y1 = this._y0;\n      this._ += \"Z\";\n    }\n  },\n  lineTo: function(x, y) {\n    this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  quadraticCurveTo: function(x1, y1, x, y) {\n    this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n    this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  arcTo: function(x1, y1, x2, y2, r) {\n    x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n    var x0 = this._x1,\n        y0 = this._y1,\n        x21 = x2 - x1,\n        y21 = y2 - y1,\n        x01 = x0 - x1,\n        y01 = y0 - y1,\n        l01_2 = x01 * x01 + y01 * y01;\n\n    // Is the radius negative? Error.\n    if (r < 0) throw new Error(\"negative radius: \" + r);\n\n    // Is this path empty? Move to (x1,y1).\n    if (this._x1 === null) {\n      this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n    }\n\n    // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n    else if (!(l01_2 > epsilon));\n\n    // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n    // Equivalently, is (x1,y1) coincident with (x2,y2)?\n    // Or, is the radius zero? Line to (x1,y1).\n    else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n      this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n    }\n\n    // Otherwise, draw an arc!\n    else {\n      var x20 = x2 - x0,\n          y20 = y2 - y0,\n          l21_2 = x21 * x21 + y21 * y21,\n          l20_2 = x20 * x20 + y20 * y20,\n          l21 = Math.sqrt(l21_2),\n          l01 = Math.sqrt(l01_2),\n          l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n          t01 = l / l01,\n          t21 = l / l21;\n\n      // If the start tangent is not coincident with (x0,y0), line to.\n      if (Math.abs(t01 - 1) > epsilon) {\n        this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n      }\n\n      this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n    }\n  },\n  arc: function(x, y, r, a0, a1, ccw) {\n    x = +x, y = +y, r = +r, ccw = !!ccw;\n    var dx = r * Math.cos(a0),\n        dy = r * Math.sin(a0),\n        x0 = x + dx,\n        y0 = y + dy,\n        cw = 1 ^ ccw,\n        da = ccw ? a0 - a1 : a1 - a0;\n\n    // Is the radius negative? Error.\n    if (r < 0) throw new Error(\"negative radius: \" + r);\n\n    // Is this path empty? Move to (x0,y0).\n    if (this._x1 === null) {\n      this._ += \"M\" + x0 + \",\" + y0;\n    }\n\n    // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n    else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n      this._ += \"L\" + x0 + \",\" + y0;\n    }\n\n    // Is this arc empty? We’re done.\n    if (!r) return;\n\n    // Does the angle go the wrong way? Flip the direction.\n    if (da < 0) da = da % tau + tau;\n\n    // Is this a complete circle? Draw two arcs to complete the circle.\n    if (da > tauEpsilon) {\n      this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n    }\n\n    // Is this arc non-empty? Draw an arc!\n    else if (da > epsilon) {\n      this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n    }\n  },\n  rect: function(x, y, w, h) {\n    this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n  },\n  toString: function() {\n    return this._;\n  }\n};\n\nexport default path;\n","import {slice} from \"./array\";\nimport constant from \"./constant\";\nimport {cos, halfPi, sin} from \"./math\";\nimport {path} from \"d3-path\";\n\nfunction defaultSource(d) {\n  return d.source;\n}\n\nfunction defaultTarget(d) {\n  return d.target;\n}\n\nfunction defaultRadius(d) {\n  return d.radius;\n}\n\nfunction defaultStartAngle(d) {\n  return d.startAngle;\n}\n\nfunction defaultEndAngle(d) {\n  return d.endAngle;\n}\n\nexport default function() {\n  var source = defaultSource,\n      target = defaultTarget,\n      radius = defaultRadius,\n      startAngle = defaultStartAngle,\n      endAngle = defaultEndAngle,\n      context = null;\n\n  function ribbon() {\n    var buffer,\n        argv = slice.call(arguments),\n        s = source.apply(this, argv),\n        t = target.apply(this, argv),\n        sr = +radius.apply(this, (argv[0] = s, argv)),\n        sa0 = startAngle.apply(this, argv) - halfPi,\n        sa1 = endAngle.apply(this, argv) - halfPi,\n        sx0 = sr * cos(sa0),\n        sy0 = sr * sin(sa0),\n        tr = +radius.apply(this, (argv[0] = t, argv)),\n        ta0 = startAngle.apply(this, argv) - halfPi,\n        ta1 = endAngle.apply(this, argv) - halfPi;\n\n    if (!context) context = buffer = path();\n\n    context.moveTo(sx0, sy0);\n    context.arc(0, 0, sr, sa0, sa1);\n    if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?\n      context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));\n      context.arc(0, 0, tr, ta0, ta1);\n    }\n    context.quadraticCurveTo(0, 0, sx0, sy0);\n    context.closePath();\n\n    if (buffer) return context = null, buffer + \"\" || null;\n  }\n\n  ribbon.radius = function(_) {\n    return arguments.length ? (radius = typeof _ === \"function\" ? _ : constant(+_), ribbon) : radius;\n  };\n\n  ribbon.startAngle = function(_) {\n    return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : startAngle;\n  };\n\n  ribbon.endAngle = function(_) {\n    return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), ribbon) : endAngle;\n  };\n\n  ribbon.source = function(_) {\n    return arguments.length ? (source = _, ribbon) : source;\n  };\n\n  ribbon.target = function(_) {\n    return arguments.length ? (target = _, ribbon) : target;\n  };\n\n  ribbon.context = function(_) {\n    return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;\n  };\n\n  return ribbon;\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\n","function responseArrayBuffer(response) {\n  if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n  return response.arrayBuffer();\n}\n\nexport default function(input, init) {\n  return fetch(input, init).then(responseArrayBuffer);\n}\n","function responseText(response) {\n  if (!response.ok) throw new Error(response.status + \" \" + response.statusText);\n  return response.text();\n}\n\nexport default function(input, init) {\n  return fetch(input, init).then(responseText);\n}\n","import {csvParse, dsvFormat, tsvParse} from \"d3-dsv\";\nimport text from \"./text\";\n\nfunction dsvParse(parse) {\n  return function(input, init, row) {\n    if (arguments.length === 2 && typeof init === \"function\") row = init, init = undefined;\n    return text(input, init).then(function(response) {\n      return parse(response, row);\n    });\n  };\n}\n\nexport default function dsv(delimiter, input, init, row) {\n  if (arguments.length === 3 && typeof init === \"function\") row = init, init = undefined;\n  var format = dsvFormat(delimiter);\n  return text(input, init).then(function(response) {\n    return format.parse(response, row);\n  });\n}\n\nexport var csv = dsvParse(csvParse);\nexport var tsv = dsvParse(tsvParse);\n","import text from \"./text\";\n\nfunction parser(type) {\n  return function(input, init)  {\n    return text(input, init).then(function(text) {\n      return (new DOMParser).parseFromString(text, type);\n    });\n  };\n}\n\nexport default parser(\"application/xml\");\n\nexport var html = parser(\"text/html\");\n\nexport var svg = parser(\"image/svg+xml\");\n","export default function(d) {\n  var x = +this._x.call(null, d),\n      y = +this._y.call(null, d);\n  return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n  if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n  var parent,\n      node = tree._root,\n      leaf = {data: d},\n      x0 = tree._x0,\n      y0 = tree._y0,\n      x1 = tree._x1,\n      y1 = tree._y1,\n      xm,\n      ym,\n      xp,\n      yp,\n      right,\n      bottom,\n      i,\n      j;\n\n  // If the tree is empty, initialize the root as a leaf.\n  if (!node) return tree._root = leaf, tree;\n\n  // Find the existing leaf for the new point, or add it.\n  while (node.length) {\n    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n    if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n  }\n\n  // Is the new point is exactly coincident with the existing point?\n  xp = +tree._x.call(null, node.data);\n  yp = +tree._y.call(null, node.data);\n  if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n  // Otherwise, split the leaf node until the old and new point are separated.\n  do {\n    parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n  } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n  return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n  var d, i, n = data.length,\n      x,\n      y,\n      xz = new Array(n),\n      yz = new Array(n),\n      x0 = Infinity,\n      y0 = Infinity,\n      x1 = -Infinity,\n      y1 = -Infinity;\n\n  // Compute the points and their extent.\n  for (i = 0; i < n; ++i) {\n    if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n    xz[i] = x;\n    yz[i] = y;\n    if (x < x0) x0 = x;\n    if (x > x1) x1 = x;\n    if (y < y0) y0 = y;\n    if (y > y1) y1 = y;\n  }\n\n  // If there were no (valid) points, abort.\n  if (x0 > x1 || y0 > y1) return this;\n\n  // Expand the tree to cover the new points.\n  this.cover(x0, y0).cover(x1, y1);\n\n  // Add the new points.\n  for (i = 0; i < n; ++i) {\n    add(this, xz[i], yz[i], data[i]);\n  }\n\n  return this;\n}\n","export default function(x, y) {\n  if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n  var x0 = this._x0,\n      y0 = this._y0,\n      x1 = this._x1,\n      y1 = this._y1;\n\n  // If the quadtree has no extent, initialize them.\n  // Integer extent are necessary so that if we later double the extent,\n  // the existing quadrant boundaries don’t change due to floating point error!\n  if (isNaN(x0)) {\n    x1 = (x0 = Math.floor(x)) + 1;\n    y1 = (y0 = Math.floor(y)) + 1;\n  }\n\n  // Otherwise, double repeatedly to cover.\n  else {\n    var z = x1 - x0,\n        node = this._root,\n        parent,\n        i;\n\n    while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n      i = (y < y0) << 1 | (x < x0);\n      parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n      switch (i) {\n        case 0: x1 = x0 + z, y1 = y0 + z; break;\n        case 1: x0 = x1 - z, y1 = y0 + z; break;\n        case 2: x1 = x0 + z, y0 = y1 - z; break;\n        case 3: x0 = x1 - z, y0 = y1 - z; break;\n      }\n    }\n\n    if (this._root && this._root.length) this._root = node;\n  }\n\n  this._x0 = x0;\n  this._y0 = y0;\n  this._x1 = x1;\n  this._y1 = y1;\n  return this;\n}\n","export default function(node, x0, y0, x1, y1) {\n  this.node = node;\n  this.x0 = x0;\n  this.y0 = y0;\n  this.x1 = x1;\n  this.y1 = y1;\n}\n","export function defaultX(d) {\n  return d[0];\n}\n\nexport default function(_) {\n  return arguments.length ? (this._x = _, this) : this._x;\n}\n","export function defaultY(d) {\n  return d[1];\n}\n\nexport default function(_) {\n  return arguments.length ? (this._y = _, this) : this._y;\n}\n","import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n  var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n  return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n  this._x = x;\n  this._y = y;\n  this._x0 = x0;\n  this._y0 = y0;\n  this._x1 = x1;\n  this._y1 = y1;\n  this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n  var copy = {data: leaf.data}, next = copy;\n  while (leaf = leaf.next) next = next.next = {data: leaf.data};\n  return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n  var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n      node = this._root,\n      nodes,\n      child;\n\n  if (!node) return copy;\n\n  if (!node.length) return copy._root = leaf_copy(node), copy;\n\n  nodes = [{source: node, target: copy._root = new Array(4)}];\n  while (node = nodes.pop()) {\n    for (var i = 0; i < 4; ++i) {\n      if (child = node.source[i]) {\n        if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n        else node.target[i] = leaf_copy(child);\n      }\n    }\n  }\n\n  return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n","export default function() {\n  var data = [];\n  this.visit(function(node) {\n    if (!node.length) do data.push(node.data); while (node = node.next)\n  });\n  return data;\n}\n","export default function(_) {\n  return arguments.length\n      ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n      : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n","import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n  var data,\n      x0 = this._x0,\n      y0 = this._y0,\n      x1,\n      y1,\n      x2,\n      y2,\n      x3 = this._x1,\n      y3 = this._y1,\n      quads = [],\n      node = this._root,\n      q,\n      i;\n\n  if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n  if (radius == null) radius = Infinity;\n  else {\n    x0 = x - radius, y0 = y - radius;\n    x3 = x + radius, y3 = y + radius;\n    radius *= radius;\n  }\n\n  while (q = quads.pop()) {\n\n    // Stop searching if this quadrant can’t contain a closer node.\n    if (!(node = q.node)\n        || (x1 = q.x0) > x3\n        || (y1 = q.y0) > y3\n        || (x2 = q.x1) < x0\n        || (y2 = q.y1) < y0) continue;\n\n    // Bisect the current quadrant.\n    if (node.length) {\n      var xm = (x1 + x2) / 2,\n          ym = (y1 + y2) / 2;\n\n      quads.push(\n        new Quad(node[3], xm, ym, x2, y2),\n        new Quad(node[2], x1, ym, xm, y2),\n        new Quad(node[1], xm, y1, x2, ym),\n        new Quad(node[0], x1, y1, xm, ym)\n      );\n\n      // Visit the closest quadrant first.\n      if (i = (y >= ym) << 1 | (x >= xm)) {\n        q = quads[quads.length - 1];\n        quads[quads.length - 1] = quads[quads.length - 1 - i];\n        quads[quads.length - 1 - i] = q;\n      }\n    }\n\n    // Visit this point. (Visiting coincident points isn’t necessary!)\n    else {\n      var dx = x - +this._x.call(null, node.data),\n          dy = y - +this._y.call(null, node.data),\n          d2 = dx * dx + dy * dy;\n      if (d2 < radius) {\n        var d = Math.sqrt(radius = d2);\n        x0 = x - d, y0 = y - d;\n        x3 = x + d, y3 = y + d;\n        data = node.data;\n      }\n    }\n  }\n\n  return data;\n}\n","export default function(d) {\n  if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n  var parent,\n      node = this._root,\n      retainer,\n      previous,\n      next,\n      x0 = this._x0,\n      y0 = this._y0,\n      x1 = this._x1,\n      y1 = this._y1,\n      x,\n      y,\n      xm,\n      ym,\n      right,\n      bottom,\n      i,\n      j;\n\n  // If the tree is empty, initialize the root as a leaf.\n  if (!node) return this;\n\n  // Find the leaf node for the point.\n  // While descending, also retain the deepest parent with a non-removed sibling.\n  if (node.length) while (true) {\n    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n    if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n    if (!node.length) break;\n    if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n  }\n\n  // Find the point to remove.\n  while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n  if (next = node.next) delete node.next;\n\n  // If there are multiple coincident points, remove just the point.\n  if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n  // If this is the root point, remove it.\n  if (!parent) return this._root = next, this;\n\n  // Remove this leaf.\n  next ? parent[i] = next : delete parent[i];\n\n  // If the parent now contains exactly one leaf, collapse superfluous parents.\n  if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n      && node === (parent[3] || parent[2] || parent[1] || parent[0])\n      && !node.length) {\n    if (retainer) retainer[j] = node;\n    else this._root = node;\n  }\n\n  return this;\n}\n\nexport function removeAll(data) {\n  for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n  return this;\n}\n","export default function() {\n  return this._root;\n}\n","export default function() {\n  var size = 0;\n  this.visit(function(node) {\n    if (!node.length) do ++size; while (node = node.next)\n  });\n  return size;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n  var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n  if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n  while (q = quads.pop()) {\n    if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n      var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n      if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n      if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n      if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n      if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n    }\n  }\n  return this;\n}\n","import Quad from \"./quad.js\";\n\nexport default function(callback) {\n  var quads = [], next = [], q;\n  if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n  while (q = quads.pop()) {\n    var node = q.node;\n    if (node.length) {\n      var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n      if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n      if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n      if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n      if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n    }\n    next.push(q);\n  }\n  while (q = next.pop()) {\n    callback(q.node, q.x0, q.y0, q.x1, q.y1);\n  }\n  return this;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {map} from \"d3-collection\";\nimport {timer} from \"d3-timer\";\n\nexport function x(d) {\n  return d.x;\n}\n\nexport function y(d) {\n  return d.y;\n}\n\nvar initialRadius = 10,\n    initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n  var simulation,\n      alpha = 1,\n      alphaMin = 0.001,\n      alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n      alphaTarget = 0,\n      velocityDecay = 0.6,\n      forces = map(),\n      stepper = timer(step),\n      event = dispatch(\"tick\", \"end\");\n\n  if (nodes == null) nodes = [];\n\n  function step() {\n    tick();\n    event.call(\"tick\", simulation);\n    if (alpha < alphaMin) {\n      stepper.stop();\n      event.call(\"end\", simulation);\n    }\n  }\n\n  function tick(iterations) {\n    var i, n = nodes.length, node;\n\n    if (iterations === undefined) iterations = 1;\n\n    for (var k = 0; k < iterations; ++k) {\n      alpha += (alphaTarget - alpha) * alphaDecay;\n\n      forces.each(function (force) {\n        force(alpha);\n      });\n\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        if (node.fx == null) node.x += node.vx *= velocityDecay;\n        else node.x = node.fx, node.vx = 0;\n        if (node.fy == null) node.y += node.vy *= velocityDecay;\n        else node.y = node.fy, node.vy = 0;\n      }\n    }\n\n    return simulation;\n  }\n\n  function initializeNodes() {\n    for (var i = 0, n = nodes.length, node; i < n; ++i) {\n      node = nodes[i], node.index = i;\n      if (node.fx != null) node.x = node.fx;\n      if (node.fy != null) node.y = node.fy;\n      if (isNaN(node.x) || isNaN(node.y)) {\n        var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;\n        node.x = radius * Math.cos(angle);\n        node.y = radius * Math.sin(angle);\n      }\n      if (isNaN(node.vx) || isNaN(node.vy)) {\n        node.vx = node.vy = 0;\n      }\n    }\n  }\n\n  function initializeForce(force) {\n    if (force.initialize) force.initialize(nodes);\n    return force;\n  }\n\n  initializeNodes();\n\n  return simulation = {\n    tick: tick,\n\n    restart: function() {\n      return stepper.restart(step), simulation;\n    },\n\n    stop: function() {\n      return stepper.stop(), simulation;\n    },\n\n    nodes: function(_) {\n      return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;\n    },\n\n    alpha: function(_) {\n      return arguments.length ? (alpha = +_, simulation) : alpha;\n    },\n\n    alphaMin: function(_) {\n      return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n    },\n\n    alphaDecay: function(_) {\n      return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n    },\n\n    alphaTarget: function(_) {\n      return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n    },\n\n    velocityDecay: function(_) {\n      return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n    },\n\n    force: function(name, _) {\n      return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n    },\n\n    find: function(x, y, radius) {\n      var i = 0,\n          n = nodes.length,\n          dx,\n          dy,\n          d2,\n          node,\n          closest;\n\n      if (radius == null) radius = Infinity;\n      else radius *= radius;\n\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        dx = x - node.x;\n        dy = y - node.y;\n        d2 = dx * dx + dy * dy;\n        if (d2 < radius) closest = node, radius = d2;\n      }\n\n      return closest;\n    },\n\n    on: function(name, _) {\n      return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n    }\n  };\n}\n","export default function(x) {\n  return x;\n}\n","function streamGeometry(geometry, stream) {\n  if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n    streamGeometryType[geometry.type](geometry, stream);\n  }\n}\n\nvar streamObjectType = {\n  Feature: function(object, stream) {\n    streamGeometry(object.geometry, stream);\n  },\n  FeatureCollection: function(object, stream) {\n    var features = object.features, i = -1, n = features.length;\n    while (++i < n) streamGeometry(features[i].geometry, stream);\n  }\n};\n\nvar streamGeometryType = {\n  Sphere: function(object, stream) {\n    stream.sphere();\n  },\n  Point: function(object, stream) {\n    object = object.coordinates;\n    stream.point(object[0], object[1], object[2]);\n  },\n  MultiPoint: function(object, stream) {\n    var coordinates = object.coordinates, i = -1, n = coordinates.length;\n    while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\n  },\n  LineString: function(object, stream) {\n    streamLine(object.coordinates, stream, 0);\n  },\n  MultiLineString: function(object, stream) {\n    var coordinates = object.coordinates, i = -1, n = coordinates.length;\n    while (++i < n) streamLine(coordinates[i], stream, 0);\n  },\n  Polygon: function(object, stream) {\n    streamPolygon(object.coordinates, stream);\n  },\n  MultiPolygon: function(object, stream) {\n    var coordinates = object.coordinates, i = -1, n = coordinates.length;\n    while (++i < n) streamPolygon(coordinates[i], stream);\n  },\n  GeometryCollection: function(object, stream) {\n    var geometries = object.geometries, i = -1, n = geometries.length;\n    while (++i < n) streamGeometry(geometries[i], stream);\n  }\n};\n\nfunction streamLine(coordinates, stream, closed) {\n  var i = -1, n = coordinates.length - closed, coordinate;\n  stream.lineStart();\n  while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n  stream.lineEnd();\n}\n\nfunction streamPolygon(coordinates, stream) {\n  var i = -1, n = coordinates.length;\n  stream.polygonStart();\n  while (++i < n) streamLine(coordinates[i], stream, 1);\n  stream.polygonEnd();\n}\n\nexport default function(object, stream) {\n  if (object && streamObjectType.hasOwnProperty(object.type)) {\n    streamObjectType[object.type](object, stream);\n  } else {\n    streamGeometry(object, stream);\n  }\n}\n","// Adds floating point numbers with twice the normal precision.\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\n// 305–363 (1997).\n// Code adapted from GeographicLib by Charles F. F. Karney,\n// http://geographiclib.sourceforge.net/\n\nexport default function() {\n  return new Adder;\n}\n\nfunction Adder() {\n  this.reset();\n}\n\nAdder.prototype = {\n  constructor: Adder,\n  reset: function() {\n    this.s = // rounded value\n    this.t = 0; // exact error\n  },\n  add: function(y) {\n    add(temp, y, this.t);\n    add(this, temp.s, this.s);\n    if (this.s) this.t += temp.t;\n    else this.s = temp.t;\n  },\n  valueOf: function() {\n    return this.s;\n  }\n};\n\nvar temp = new Adder;\n\nfunction add(adder, a, b) {\n  var x = adder.s = a + b,\n      bv = x - a,\n      av = x - bv;\n  adder.t = (a - av) + (b - bv);\n}\n","export var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var quarterPi = pi / 4;\nexport var tau = pi * 2;\n\nexport var degrees = 180 / pi;\nexport var radians = pi / 180;\n\nexport var abs = Math.abs;\nexport var atan = Math.atan;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var ceil = Math.ceil;\nexport var exp = Math.exp;\nexport var floor = Math.floor;\nexport var log = Math.log;\nexport var pow = Math.pow;\nexport var sin = Math.sin;\nexport var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };\nexport var sqrt = Math.sqrt;\nexport var tan = Math.tan;\n\nexport function acos(x) {\n  return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n  return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nexport function haversin(x) {\n  return (x = sin(x / 2)) * x;\n}\n","export default function noop() {}\n","import adder from \"../adder.js\";\nimport {abs} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar areaSum = adder(),\n    areaRingSum = adder(),\n    x00,\n    y00,\n    x0,\n    y0;\n\nvar areaStream = {\n  point: noop,\n  lineStart: noop,\n  lineEnd: noop,\n  polygonStart: function() {\n    areaStream.lineStart = areaRingStart;\n    areaStream.lineEnd = areaRingEnd;\n  },\n  polygonEnd: function() {\n    areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop;\n    areaSum.add(abs(areaRingSum));\n    areaRingSum.reset();\n  },\n  result: function() {\n    var area = areaSum / 2;\n    areaSum.reset();\n    return area;\n  }\n};\n\nfunction areaRingStart() {\n  areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n  areaStream.point = areaPoint;\n  x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n  areaRingSum.add(y0 * x - x0 * y);\n  x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n  areaPoint(x00, y00);\n}\n\nexport default areaStream;\n","import noop from \"../noop.js\";\n\nvar x0 = Infinity,\n    y0 = x0,\n    x1 = -x0,\n    y1 = x1;\n\nvar boundsStream = {\n  point: boundsPoint,\n  lineStart: noop,\n  lineEnd: noop,\n  polygonStart: noop,\n  polygonEnd: noop,\n  result: function() {\n    var bounds = [[x0, y0], [x1, y1]];\n    x1 = y1 = -(y0 = x0 = Infinity);\n    return bounds;\n  }\n};\n\nfunction boundsPoint(x, y) {\n  if (x < x0) x0 = x;\n  if (x > x1) x1 = x;\n  if (y < y0) y0 = y;\n  if (y > y1) y1 = y;\n}\n\nexport default boundsStream;\n","import {sqrt} from \"../math.js\";\n\n// TODO Enforce positive area for exterior, negative area for interior?\n\nvar X0 = 0,\n    Y0 = 0,\n    Z0 = 0,\n    X1 = 0,\n    Y1 = 0,\n    Z1 = 0,\n    X2 = 0,\n    Y2 = 0,\n    Z2 = 0,\n    x00,\n    y00,\n    x0,\n    y0;\n\nvar centroidStream = {\n  point: centroidPoint,\n  lineStart: centroidLineStart,\n  lineEnd: centroidLineEnd,\n  polygonStart: function() {\n    centroidStream.lineStart = centroidRingStart;\n    centroidStream.lineEnd = centroidRingEnd;\n  },\n  polygonEnd: function() {\n    centroidStream.point = centroidPoint;\n    centroidStream.lineStart = centroidLineStart;\n    centroidStream.lineEnd = centroidLineEnd;\n  },\n  result: function() {\n    var centroid = Z2 ? [X2 / Z2, Y2 / Z2]\n        : Z1 ? [X1 / Z1, Y1 / Z1]\n        : Z0 ? [X0 / Z0, Y0 / Z0]\n        : [NaN, NaN];\n    X0 = Y0 = Z0 =\n    X1 = Y1 = Z1 =\n    X2 = Y2 = Z2 = 0;\n    return centroid;\n  }\n};\n\nfunction centroidPoint(x, y) {\n  X0 += x;\n  Y0 += y;\n  ++Z0;\n}\n\nfunction centroidLineStart() {\n  centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n  centroidStream.point = centroidPointLine;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n  var dx = x - x0, dy = y - y0, z = sqrt(dx * dx + dy * dy);\n  X1 += z * (x0 + x) / 2;\n  Y1 += z * (y0 + y) / 2;\n  Z1 += z;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n  centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n  centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n  centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n  centroidStream.point = centroidPointRing;\n  centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n  var dx = x - x0,\n      dy = y - y0,\n      z = sqrt(dx * dx + dy * dy);\n\n  X1 += z * (x0 + x) / 2;\n  Y1 += z * (y0 + y) / 2;\n  Z1 += z;\n\n  z = y0 * x - x0 * y;\n  X2 += z * (x0 + x);\n  Y2 += z * (y0 + y);\n  Z2 += z * 3;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nexport default centroidStream;\n","import {tau} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nexport default function PathContext(context) {\n  this._context = context;\n}\n\nPathContext.prototype = {\n  _radius: 4.5,\n  pointRadius: function(_) {\n    return this._radius = _, this;\n  },\n  polygonStart: function() {\n    this._line = 0;\n  },\n  polygonEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (this._line === 0) this._context.closePath();\n    this._point = NaN;\n  },\n  point: function(x, y) {\n    switch (this._point) {\n      case 0: {\n        this._context.moveTo(x, y);\n        this._point = 1;\n        break;\n      }\n      case 1: {\n        this._context.lineTo(x, y);\n        break;\n      }\n      default: {\n        this._context.moveTo(x + this._radius, y);\n        this._context.arc(x, y, this._radius, 0, tau);\n        break;\n      }\n    }\n  },\n  result: noop\n};\n","import adder from \"../adder.js\";\nimport {sqrt} from \"../math.js\";\nimport noop from \"../noop.js\";\n\nvar lengthSum = adder(),\n    lengthRing,\n    x00,\n    y00,\n    x0,\n    y0;\n\nvar lengthStream = {\n  point: noop,\n  lineStart: function() {\n    lengthStream.point = lengthPointFirst;\n  },\n  lineEnd: function() {\n    if (lengthRing) lengthPoint(x00, y00);\n    lengthStream.point = noop;\n  },\n  polygonStart: function() {\n    lengthRing = true;\n  },\n  polygonEnd: function() {\n    lengthRing = null;\n  },\n  result: function() {\n    var length = +lengthSum;\n    lengthSum.reset();\n    return length;\n  }\n};\n\nfunction lengthPointFirst(x, y) {\n  lengthStream.point = lengthPoint;\n  x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n  x0 -= x, y0 -= y;\n  lengthSum.add(sqrt(x0 * x0 + y0 * y0));\n  x0 = x, y0 = y;\n}\n\nexport default lengthStream;\n","export default function PathString() {\n  this._string = [];\n}\n\nPathString.prototype = {\n  _radius: 4.5,\n  _circle: circle(4.5),\n  pointRadius: function(_) {\n    if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n    return this;\n  },\n  polygonStart: function() {\n    this._line = 0;\n  },\n  polygonEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (this._line === 0) this._string.push(\"Z\");\n    this._point = NaN;\n  },\n  point: function(x, y) {\n    switch (this._point) {\n      case 0: {\n        this._string.push(\"M\", x, \",\", y);\n        this._point = 1;\n        break;\n      }\n      case 1: {\n        this._string.push(\"L\", x, \",\", y);\n        break;\n      }\n      default: {\n        if (this._circle == null) this._circle = circle(this._radius);\n        this._string.push(\"M\", x, \",\", y, this._circle);\n        break;\n      }\n    }\n  },\n  result: function() {\n    if (this._string.length) {\n      var result = this._string.join(\"\");\n      this._string = [];\n      return result;\n    } else {\n      return null;\n    }\n  }\n};\n\nfunction circle(radius) {\n  return \"m0,\" + radius\n      + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius\n      + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius\n      + \"z\";\n}\n","import identity from \"../identity.js\";\nimport stream from \"../stream.js\";\nimport pathArea from \"./area.js\";\nimport pathBounds from \"./bounds.js\";\nimport pathCentroid from \"./centroid.js\";\nimport PathContext from \"./context.js\";\nimport pathMeasure from \"./measure.js\";\nimport PathString from \"./string.js\";\n\nexport default function(projection, context) {\n  var pointRadius = 4.5,\n      projectionStream,\n      contextStream;\n\n  function path(object) {\n    if (object) {\n      if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n      stream(object, projectionStream(contextStream));\n    }\n    return contextStream.result();\n  }\n\n  path.area = function(object) {\n    stream(object, projectionStream(pathArea));\n    return pathArea.result();\n  };\n\n  path.measure = function(object) {\n    stream(object, projectionStream(pathMeasure));\n    return pathMeasure.result();\n  };\n\n  path.bounds = function(object) {\n    stream(object, projectionStream(pathBounds));\n    return pathBounds.result();\n  };\n\n  path.centroid = function(object) {\n    stream(object, projectionStream(pathCentroid));\n    return pathCentroid.result();\n  };\n\n  path.projection = function(_) {\n    return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection;\n  };\n\n  path.context = function(_) {\n    if (!arguments.length) return context;\n    contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);\n    if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n    return path;\n  };\n\n  path.pointRadius = function(_) {\n    if (!arguments.length) return pointRadius;\n    pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n    return path;\n  };\n\n  return path.projection(projection).context(context);\n}\n","import pointEqual from \"../pointEqual.js\";\n\nfunction Intersection(point, points, other, entry) {\n  this.x = point;\n  this.z = points;\n  this.o = other; // another intersection\n  this.e = entry; // is an entry?\n  this.v = false; // visited\n  this.n = this.p = null; // next & previous\n}\n\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexport default function(segments, compareIntersection, startInside, interpolate, stream) {\n  var subject = [],\n      clip = [],\n      i,\n      n;\n\n  segments.forEach(function(segment) {\n    if ((n = segment.length - 1) <= 0) return;\n    var n, p0 = segment[0], p1 = segment[n], x;\n\n    // If the first and last points of a segment are coincident, then treat as a\n    // closed ring. TODO if all rings are closed, then the winding order of the\n    // exterior ring should be checked.\n    if (pointEqual(p0, p1)) {\n      stream.lineStart();\n      for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n      stream.lineEnd();\n      return;\n    }\n\n    subject.push(x = new Intersection(p0, segment, null, true));\n    clip.push(x.o = new Intersection(p0, null, x, false));\n    subject.push(x = new Intersection(p1, segment, null, false));\n    clip.push(x.o = new Intersection(p1, null, x, true));\n  });\n\n  if (!subject.length) return;\n\n  clip.sort(compareIntersection);\n  link(subject);\n  link(clip);\n\n  for (i = 0, n = clip.length; i < n; ++i) {\n    clip[i].e = startInside = !startInside;\n  }\n\n  var start = subject[0],\n      points,\n      point;\n\n  while (1) {\n    // Find first unvisited intersection.\n    var current = start,\n        isSubject = true;\n    while (current.v) if ((current = current.n) === start) return;\n    points = current.z;\n    stream.lineStart();\n    do {\n      current.v = current.o.v = true;\n      if (current.e) {\n        if (isSubject) {\n          for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n        } else {\n          interpolate(current.x, current.n.x, 1, stream);\n        }\n        current = current.n;\n      } else {\n        if (isSubject) {\n          points = current.p.z;\n          for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n        } else {\n          interpolate(current.x, current.p.x, -1, stream);\n        }\n        current = current.p;\n      }\n      current = current.o;\n      points = current.z;\n      isSubject = !isSubject;\n    } while (!current.v);\n    stream.lineEnd();\n  }\n}\n\nfunction link(array) {\n  if (!(n = array.length)) return;\n  var n,\n      i = 0,\n      a = array[0],\n      b;\n  while (++i < n) {\n    a.n = b = array[i];\n    b.p = a;\n    a = b;\n  }\n  a.n = b = array[0];\n  b.p = a;\n}\n","import {abs, epsilon} from \"./math.js\";\n\nexport default function(a, b) {\n  return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon;\n}\n","import {abs, epsilon} from \"../math.js\";\nimport clipBuffer from \"./buffer.js\";\nimport clipLine from \"./line.js\";\nimport clipRejoin from \"./rejoin.js\";\nimport {merge} from \"d3-array\";\n\nvar clipMax = 1e9, clipMin = -clipMax;\n\n// TODO Use d3-polygon’s polygonContains here for the ring check?\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\n\nexport default function clipRectangle(x0, y0, x1, y1) {\n\n  function visible(x, y) {\n    return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n  }\n\n  function interpolate(from, to, direction, stream) {\n    var a = 0, a1 = 0;\n    if (from == null\n        || (a = corner(from, direction)) !== (a1 = corner(to, direction))\n        || comparePoint(from, to) < 0 ^ direction > 0) {\n      do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n      while ((a = (a + direction + 4) % 4) !== a1);\n    } else {\n      stream.point(to[0], to[1]);\n    }\n  }\n\n  function corner(p, direction) {\n    return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3\n        : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1\n        : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0\n        : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n  }\n\n  function compareIntersection(a, b) {\n    return comparePoint(a.x, b.x);\n  }\n\n  function comparePoint(a, b) {\n    var ca = corner(a, 1),\n        cb = corner(b, 1);\n    return ca !== cb ? ca - cb\n        : ca === 0 ? b[1] - a[1]\n        : ca === 1 ? a[0] - b[0]\n        : ca === 2 ? a[1] - b[1]\n        : b[0] - a[0];\n  }\n\n  return function(stream) {\n    var activeStream = stream,\n        bufferStream = clipBuffer(),\n        segments,\n        polygon,\n        ring,\n        x__, y__, v__, // first point\n        x_, y_, v_, // previous point\n        first,\n        clean;\n\n    var clipStream = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: polygonStart,\n      polygonEnd: polygonEnd\n    };\n\n    function point(x, y) {\n      if (visible(x, y)) activeStream.point(x, y);\n    }\n\n    function polygonInside() {\n      var winding = 0;\n\n      for (var i = 0, n = polygon.length; i < n; ++i) {\n        for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\n          a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n          if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }\n          else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }\n        }\n      }\n\n      return winding;\n    }\n\n    // Buffer geometry within a polygon and then clip it en masse.\n    function polygonStart() {\n      activeStream = bufferStream, segments = [], polygon = [], clean = true;\n    }\n\n    function polygonEnd() {\n      var startInside = polygonInside(),\n          cleanInside = clean && startInside,\n          visible = (segments = merge(segments)).length;\n      if (cleanInside || visible) {\n        stream.polygonStart();\n        if (cleanInside) {\n          stream.lineStart();\n          interpolate(null, null, 1, stream);\n          stream.lineEnd();\n        }\n        if (visible) {\n          clipRejoin(segments, compareIntersection, startInside, interpolate, stream);\n        }\n        stream.polygonEnd();\n      }\n      activeStream = stream, segments = polygon = ring = null;\n    }\n\n    function lineStart() {\n      clipStream.point = linePoint;\n      if (polygon) polygon.push(ring = []);\n      first = true;\n      v_ = false;\n      x_ = y_ = NaN;\n    }\n\n    // TODO rather than special-case polygons, simply handle them separately.\n    // Ideally, coincident intersection points should be jittered to avoid\n    // clipping issues.\n    function lineEnd() {\n      if (segments) {\n        linePoint(x__, y__);\n        if (v__ && v_) bufferStream.rejoin();\n        segments.push(bufferStream.result());\n      }\n      clipStream.point = point;\n      if (v_) activeStream.lineEnd();\n    }\n\n    function linePoint(x, y) {\n      var v = visible(x, y);\n      if (polygon) ring.push([x, y]);\n      if (first) {\n        x__ = x, y__ = y, v__ = v;\n        first = false;\n        if (v) {\n          activeStream.lineStart();\n          activeStream.point(x, y);\n        }\n      } else {\n        if (v && v_) activeStream.point(x, y);\n        else {\n          var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\n              b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\n          if (clipLine(a, b, x0, y0, x1, y1)) {\n            if (!v_) {\n              activeStream.lineStart();\n              activeStream.point(a[0], a[1]);\n            }\n            activeStream.point(b[0], b[1]);\n            if (!v) activeStream.lineEnd();\n            clean = false;\n          } else if (v) {\n            activeStream.lineStart();\n            activeStream.point(x, y);\n            clean = false;\n          }\n        }\n      }\n      x_ = x, y_ = y, v_ = v;\n    }\n\n    return clipStream;\n  };\n}\n","import noop from \"../noop.js\";\n\nexport default function() {\n  var lines = [],\n      line;\n  return {\n    point: function(x, y) {\n      line.push([x, y]);\n    },\n    lineStart: function() {\n      lines.push(line = []);\n    },\n    lineEnd: noop,\n    rejoin: function() {\n      if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n    },\n    result: function() {\n      var result = lines;\n      lines = [];\n      line = null;\n      return result;\n    }\n  };\n}\n","export default function(a, b, x0, y0, x1, y1) {\n  var ax = a[0],\n      ay = a[1],\n      bx = b[0],\n      by = b[1],\n      t0 = 0,\n      t1 = 1,\n      dx = bx - ax,\n      dy = by - ay,\n      r;\n\n  r = x0 - ax;\n  if (!dx && r > 0) return;\n  r /= dx;\n  if (dx < 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  } else if (dx > 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  }\n\n  r = x1 - ax;\n  if (!dx && r < 0) return;\n  r /= dx;\n  if (dx < 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  } else if (dx > 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  }\n\n  r = y0 - ay;\n  if (!dy && r > 0) return;\n  r /= dy;\n  if (dy < 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  } else if (dy > 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  }\n\n  r = y1 - ay;\n  if (!dy && r < 0) return;\n  r /= dy;\n  if (dy < 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  } else if (dy > 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  }\n\n  if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n  if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n  return true;\n}\n","export default function(methods) {\n  return {\n    stream: transformer(methods)\n  };\n}\n\nexport function transformer(methods) {\n  return function(stream) {\n    var s = new TransformStream;\n    for (var key in methods) s[key] = methods[key];\n    s.stream = stream;\n    return s;\n  };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n  constructor: TransformStream,\n  point: function(x, y) { this.stream.point(x, y); },\n  sphere: function() { this.stream.sphere(); },\n  lineStart: function() { this.stream.lineStart(); },\n  lineEnd: function() { this.stream.lineEnd(); },\n  polygonStart: function() { this.stream.polygonStart(); },\n  polygonEnd: function() { this.stream.polygonEnd(); }\n};\n","import {default as geoStream} from \"../stream.js\";\nimport boundsStream from \"../path/bounds.js\";\n\nfunction fit(projection, fitBounds, object) {\n  var clip = projection.clipExtent && projection.clipExtent();\n  projection.scale(150).translate([0, 0]);\n  if (clip != null) projection.clipExtent(null);\n  geoStream(object, projection.stream(boundsStream));\n  fitBounds(boundsStream.result());\n  if (clip != null) projection.clipExtent(clip);\n  return projection;\n}\n\nexport function fitExtent(projection, extent, object) {\n  return fit(projection, function(b) {\n    var w = extent[1][0] - extent[0][0],\n        h = extent[1][1] - extent[0][1],\n        k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\n        x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\n        y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n    projection.scale(150 * k).translate([x, y]);\n  }, object);\n}\n\nexport function fitSize(projection, size, object) {\n  return fitExtent(projection, [[0, 0], size], object);\n}\n\nexport function fitWidth(projection, width, object) {\n  return fit(projection, function(b) {\n    var w = +width,\n        k = w / (b[1][0] - b[0][0]),\n        x = (w - k * (b[1][0] + b[0][0])) / 2,\n        y = -k * b[0][1];\n    projection.scale(150 * k).translate([x, y]);\n  }, object);\n}\n\nexport function fitHeight(projection, height, object) {\n  return fit(projection, function(b) {\n    var h = +height,\n        k = h / (b[1][1] - b[0][1]),\n        x = -k * b[0][0],\n        y = (h - k * (b[1][1] + b[0][1])) / 2;\n    projection.scale(150 * k).translate([x, y]);\n  }, object);\n}\n","import clipRectangle from \"../clip/rectangle.js\";\nimport identity from \"../identity.js\";\nimport {transformer} from \"../transform.js\";\nimport {fitExtent, fitSize, fitWidth, fitHeight} from \"./fit.js\";\n\nfunction scaleTranslate(kx, ky, tx, ty) {\n  return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity : transformer({\n    point: function(x, y) {\n      this.stream.point(x * kx + tx, y * ky + ty);\n    }\n  });\n}\n\nexport default function() {\n  var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity, // scale, translate and reflect\n      x0 = null, y0, x1, y1, // clip extent\n      postclip = identity,\n      cache,\n      cacheStream,\n      projection;\n\n  function reset() {\n    cache = cacheStream = null;\n    return projection;\n  }\n\n  return projection = {\n    stream: function(stream) {\n      return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));\n    },\n    postclip: function(_) {\n      return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n    },\n    clipExtent: function(_) {\n      return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n    },\n    scale: function(_) {\n      return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;\n    },\n    translate: function(_) {\n      return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];\n    },\n    reflectX: function(_) {\n      return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;\n    },\n    reflectY: function(_) {\n      return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;\n    },\n    fitExtent: function(extent, object) {\n      return fitExtent(projection, extent, object);\n    },\n    fitSize: function(size, object) {\n      return fitSize(projection, size, object);\n    },\n    fitWidth: function(width, object) {\n      return fitWidth(projection, width, object);\n    },\n    fitHeight: function(height, object) {\n      return fitHeight(projection, height, object);\n    }\n  };\n}\n","export default function() {\n  return Math.random();\n}\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomNormal(source) {\n  function randomNormal(mu, sigma) {\n    var x, r;\n    mu = mu == null ? 0 : +mu;\n    sigma = sigma == null ? 1 : +sigma;\n    return function() {\n      var y;\n\n      // If available, use the second previously-generated uniform random.\n      if (x != null) y = x, x = null;\n\n      // Otherwise, generate a new x and y.\n      else do {\n        x = source() * 2 - 1;\n        y = source() * 2 - 1;\n        r = x * x + y * y;\n      } while (!r || r > 1);\n\n      return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);\n    };\n  }\n\n  randomNormal.source = sourceRandomNormal;\n\n  return randomNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomUniform(source) {\n  function randomUniform(min, max) {\n    min = min == null ? 0 : +min;\n    max = max == null ? 1 : +max;\n    if (arguments.length === 1) max = min, min = 0;\n    else max -= min;\n    return function() {\n      return source() * max + min;\n    };\n  }\n\n  randomUniform.source = sourceRandomUniform;\n\n  return randomUniform;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomIrwinHall(source) {\n  function randomIrwinHall(n) {\n    return function() {\n      for (var sum = 0, i = 0; i < n; ++i) sum += source();\n      return sum;\n    };\n  }\n\n  randomIrwinHall.source = sourceRandomIrwinHall;\n\n  return randomIrwinHall;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport normal from \"./normal\";\n\nexport default (function sourceRandomLogNormal(source) {\n  function randomLogNormal() {\n    var randomNormal = normal.source(source).apply(this, arguments);\n    return function() {\n      return Math.exp(randomNormal());\n    };\n  }\n\n  randomLogNormal.source = sourceRandomLogNormal;\n\n  return randomLogNormal;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\nimport irwinHall from \"./irwinHall\";\n\nexport default (function sourceRandomBates(source) {\n  function randomBates(n) {\n    var randomIrwinHall = irwinHall.source(source)(n);\n    return function() {\n      return randomIrwinHall() / n;\n    };\n  }\n\n  randomBates.source = sourceRandomBates;\n\n  return randomBates;\n})(defaultSource);\n","import defaultSource from \"./defaultSource\";\n\nexport default (function sourceRandomExponential(source) {\n  function randomExponential(lambda) {\n    return function() {\n      return -Math.log(1 - source()) / lambda;\n    };\n  }\n\n  randomExponential.source = sourceRandomExponential;\n\n  return randomExponential;\n})(defaultSource);\n","export default function(x) {\n  return function constant() {\n    return x;\n  };\n}\n","function Linear(context) {\n  this._context = context;\n}\n\nLinear.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    x = +x, y = +y;\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; // proceed\n      default: this._context.lineTo(x, y); break;\n    }\n  }\n};\n\nexport default function(context) {\n  return new Linear(context);\n}\n","export function x(p) {\n  return p[0];\n}\n\nexport function y(p) {\n  return p[1];\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function() {\n  var x = pointX,\n      y = pointY,\n      defined = constant(true),\n      context = null,\n      curve = curveLinear,\n      output = null;\n\n  function line(data) {\n    var i,\n        n = data.length,\n        d,\n        defined0 = false,\n        buffer;\n\n    if (context == null) output = curve(buffer = path());\n\n    for (i = 0; i <= n; ++i) {\n      if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n        if (defined0 = !defined0) output.lineStart();\n        else output.lineEnd();\n      }\n      if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n    }\n\n    if (buffer) return output = null, buffer + \"\" || null;\n  }\n\n  line.x = function(_) {\n    return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n  };\n\n  line.y = function(_) {\n    return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n  };\n\n  line.defined = function(_) {\n    return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n  };\n\n  line.curve = function(_) {\n    return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n  };\n\n  line.context = function(_) {\n    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n  };\n\n  return line;\n}\n","function RedBlackTree() {\n  this._ = null; // root node\n}\n\nexport function RedBlackNode(node) {\n  node.U = // parent node\n  node.C = // color - true for red, false for black\n  node.L = // left node\n  node.R = // right node\n  node.P = // previous node\n  node.N = null; // next node\n}\n\nRedBlackTree.prototype = {\n  constructor: RedBlackTree,\n\n  insert: function(after, node) {\n    var parent, grandpa, uncle;\n\n    if (after) {\n      node.P = after;\n      node.N = after.N;\n      if (after.N) after.N.P = node;\n      after.N = node;\n      if (after.R) {\n        after = after.R;\n        while (after.L) after = after.L;\n        after.L = node;\n      } else {\n        after.R = node;\n      }\n      parent = after;\n    } else if (this._) {\n      after = RedBlackFirst(this._);\n      node.P = null;\n      node.N = after;\n      after.P = after.L = node;\n      parent = after;\n    } else {\n      node.P = node.N = null;\n      this._ = node;\n      parent = null;\n    }\n    node.L = node.R = null;\n    node.U = parent;\n    node.C = true;\n\n    after = node;\n    while (parent && parent.C) {\n      grandpa = parent.U;\n      if (parent === grandpa.L) {\n        uncle = grandpa.R;\n        if (uncle && uncle.C) {\n          parent.C = uncle.C = false;\n          grandpa.C = true;\n          after = grandpa;\n        } else {\n          if (after === parent.R) {\n            RedBlackRotateLeft(this, parent);\n            after = parent;\n            parent = after.U;\n          }\n          parent.C = false;\n          grandpa.C = true;\n          RedBlackRotateRight(this, grandpa);\n        }\n      } else {\n        uncle = grandpa.L;\n        if (uncle && uncle.C) {\n          parent.C = uncle.C = false;\n          grandpa.C = true;\n          after = grandpa;\n        } else {\n          if (after === parent.L) {\n            RedBlackRotateRight(this, parent);\n            after = parent;\n            parent = after.U;\n          }\n          parent.C = false;\n          grandpa.C = true;\n          RedBlackRotateLeft(this, grandpa);\n        }\n      }\n      parent = after.U;\n    }\n    this._.C = false;\n  },\n\n  remove: function(node) {\n    if (node.N) node.N.P = node.P;\n    if (node.P) node.P.N = node.N;\n    node.N = node.P = null;\n\n    var parent = node.U,\n        sibling,\n        left = node.L,\n        right = node.R,\n        next,\n        red;\n\n    if (!left) next = right;\n    else if (!right) next = left;\n    else next = RedBlackFirst(right);\n\n    if (parent) {\n      if (parent.L === node) parent.L = next;\n      else parent.R = next;\n    } else {\n      this._ = next;\n    }\n\n    if (left && right) {\n      red = next.C;\n      next.C = node.C;\n      next.L = left;\n      left.U = next;\n      if (next !== right) {\n        parent = next.U;\n        next.U = node.U;\n        node = next.R;\n        parent.L = node;\n        next.R = right;\n        right.U = next;\n      } else {\n        next.U = parent;\n        parent = next;\n        node = next.R;\n      }\n    } else {\n      red = node.C;\n      node = next;\n    }\n\n    if (node) node.U = parent;\n    if (red) return;\n    if (node && node.C) { node.C = false; return; }\n\n    do {\n      if (node === this._) break;\n      if (node === parent.L) {\n        sibling = parent.R;\n        if (sibling.C) {\n          sibling.C = false;\n          parent.C = true;\n          RedBlackRotateLeft(this, parent);\n          sibling = parent.R;\n        }\n        if ((sibling.L && sibling.L.C)\n            || (sibling.R && sibling.R.C)) {\n          if (!sibling.R || !sibling.R.C) {\n            sibling.L.C = false;\n            sibling.C = true;\n            RedBlackRotateRight(this, sibling);\n            sibling = parent.R;\n          }\n          sibling.C = parent.C;\n          parent.C = sibling.R.C = false;\n          RedBlackRotateLeft(this, parent);\n          node = this._;\n          break;\n        }\n      } else {\n        sibling = parent.L;\n        if (sibling.C) {\n          sibling.C = false;\n          parent.C = true;\n          RedBlackRotateRight(this, parent);\n          sibling = parent.L;\n        }\n        if ((sibling.L && sibling.L.C)\n          || (sibling.R && sibling.R.C)) {\n          if (!sibling.L || !sibling.L.C) {\n            sibling.R.C = false;\n            sibling.C = true;\n            RedBlackRotateLeft(this, sibling);\n            sibling = parent.L;\n          }\n          sibling.C = parent.C;\n          parent.C = sibling.L.C = false;\n          RedBlackRotateRight(this, parent);\n          node = this._;\n          break;\n        }\n      }\n      sibling.C = true;\n      node = parent;\n      parent = parent.U;\n    } while (!node.C);\n\n    if (node) node.C = false;\n  }\n};\n\nfunction RedBlackRotateLeft(tree, node) {\n  var p = node,\n      q = node.R,\n      parent = p.U;\n\n  if (parent) {\n    if (parent.L === p) parent.L = q;\n    else parent.R = q;\n  } else {\n    tree._ = q;\n  }\n\n  q.U = parent;\n  p.U = q;\n  p.R = q.L;\n  if (p.R) p.R.U = p;\n  q.L = p;\n}\n\nfunction RedBlackRotateRight(tree, node) {\n  var p = node,\n      q = node.L,\n      parent = p.U;\n\n  if (parent) {\n    if (parent.L === p) parent.L = q;\n    else parent.R = q;\n  } else {\n    tree._ = q;\n  }\n\n  q.U = parent;\n  p.U = q;\n  p.L = q.R;\n  if (p.L) p.L.U = p;\n  q.R = p;\n}\n\nfunction RedBlackFirst(node) {\n  while (node.L) node = node.L;\n  return node;\n}\n\nexport default RedBlackTree;\n","import {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createEdge(left, right, v0, v1) {\n  var edge = [null, null],\n      index = edges.push(edge) - 1;\n  edge.left = left;\n  edge.right = right;\n  if (v0) setEdgeEnd(edge, left, right, v0);\n  if (v1) setEdgeEnd(edge, right, left, v1);\n  cells[left.index].halfedges.push(index);\n  cells[right.index].halfedges.push(index);\n  return edge;\n}\n\nexport function createBorderEdge(left, v0, v1) {\n  var edge = [v0, v1];\n  edge.left = left;\n  return edge;\n}\n\nexport function setEdgeEnd(edge, left, right, vertex) {\n  if (!edge[0] && !edge[1]) {\n    edge[0] = vertex;\n    edge.left = left;\n    edge.right = right;\n  } else if (edge.left === right) {\n    edge[1] = vertex;\n  } else {\n    edge[0] = vertex;\n  }\n}\n\n// Liang–Barsky line clipping.\nfunction clipEdge(edge, x0, y0, x1, y1) {\n  var a = edge[0],\n      b = edge[1],\n      ax = a[0],\n      ay = a[1],\n      bx = b[0],\n      by = b[1],\n      t0 = 0,\n      t1 = 1,\n      dx = bx - ax,\n      dy = by - ay,\n      r;\n\n  r = x0 - ax;\n  if (!dx && r > 0) return;\n  r /= dx;\n  if (dx < 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  } else if (dx > 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  }\n\n  r = x1 - ax;\n  if (!dx && r < 0) return;\n  r /= dx;\n  if (dx < 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  } else if (dx > 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  }\n\n  r = y0 - ay;\n  if (!dy && r > 0) return;\n  r /= dy;\n  if (dy < 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  } else if (dy > 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  }\n\n  r = y1 - ay;\n  if (!dy && r < 0) return;\n  r /= dy;\n  if (dy < 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  } else if (dy > 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  }\n\n  if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?\n\n  if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];\n  if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];\n  return true;\n}\n\nfunction connectEdge(edge, x0, y0, x1, y1) {\n  var v1 = edge[1];\n  if (v1) return true;\n\n  var v0 = edge[0],\n      left = edge.left,\n      right = edge.right,\n      lx = left[0],\n      ly = left[1],\n      rx = right[0],\n      ry = right[1],\n      fx = (lx + rx) / 2,\n      fy = (ly + ry) / 2,\n      fm,\n      fb;\n\n  if (ry === ly) {\n    if (fx < x0 || fx >= x1) return;\n    if (lx > rx) {\n      if (!v0) v0 = [fx, y0];\n      else if (v0[1] >= y1) return;\n      v1 = [fx, y1];\n    } else {\n      if (!v0) v0 = [fx, y1];\n      else if (v0[1] < y0) return;\n      v1 = [fx, y0];\n    }\n  } else {\n    fm = (lx - rx) / (ry - ly);\n    fb = fy - fm * fx;\n    if (fm < -1 || fm > 1) {\n      if (lx > rx) {\n        if (!v0) v0 = [(y0 - fb) / fm, y0];\n        else if (v0[1] >= y1) return;\n        v1 = [(y1 - fb) / fm, y1];\n      } else {\n        if (!v0) v0 = [(y1 - fb) / fm, y1];\n        else if (v0[1] < y0) return;\n        v1 = [(y0 - fb) / fm, y0];\n      }\n    } else {\n      if (ly < ry) {\n        if (!v0) v0 = [x0, fm * x0 + fb];\n        else if (v0[0] >= x1) return;\n        v1 = [x1, fm * x1 + fb];\n      } else {\n        if (!v0) v0 = [x1, fm * x1 + fb];\n        else if (v0[0] < x0) return;\n        v1 = [x0, fm * x0 + fb];\n      }\n    }\n  }\n\n  edge[0] = v0;\n  edge[1] = v1;\n  return true;\n}\n\nexport function clipEdges(x0, y0, x1, y1) {\n  var i = edges.length,\n      edge;\n\n  while (i--) {\n    if (!connectEdge(edge = edges[i], x0, y0, x1, y1)\n        || !clipEdge(edge, x0, y0, x1, y1)\n        || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon\n            || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) {\n      delete edges[i];\n    }\n  }\n}\n","import {createBorderEdge} from \"./Edge\";\nimport {cells, edges, epsilon} from \"./Diagram\";\n\nexport function createCell(site) {\n  return cells[site.index] = {\n    site: site,\n    halfedges: []\n  };\n}\n\nfunction cellHalfedgeAngle(cell, edge) {\n  var site = cell.site,\n      va = edge.left,\n      vb = edge.right;\n  if (site === vb) vb = va, va = site;\n  if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);\n  if (site === va) va = edge[1], vb = edge[0];\n  else va = edge[0], vb = edge[1];\n  return Math.atan2(va[0] - vb[0], vb[1] - va[1]);\n}\n\nexport function cellHalfedgeStart(cell, edge) {\n  return edge[+(edge.left !== cell.site)];\n}\n\nexport function cellHalfedgeEnd(cell, edge) {\n  return edge[+(edge.left === cell.site)];\n}\n\nexport function sortCellHalfedges() {\n  for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {\n    if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {\n      var index = new Array(m),\n          array = new Array(m);\n      for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);\n      index.sort(function(i, j) { return array[j] - array[i]; });\n      for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];\n      for (j = 0; j < m; ++j) halfedges[j] = array[j];\n    }\n  }\n}\n\nexport function clipCells(x0, y0, x1, y1) {\n  var nCells = cells.length,\n      iCell,\n      cell,\n      site,\n      iHalfedge,\n      halfedges,\n      nHalfedges,\n      start,\n      startX,\n      startY,\n      end,\n      endX,\n      endY,\n      cover = true;\n\n  for (iCell = 0; iCell < nCells; ++iCell) {\n    if (cell = cells[iCell]) {\n      site = cell.site;\n      halfedges = cell.halfedges;\n      iHalfedge = halfedges.length;\n\n      // Remove any dangling clipped edges.\n      while (iHalfedge--) {\n        if (!edges[halfedges[iHalfedge]]) {\n          halfedges.splice(iHalfedge, 1);\n        }\n      }\n\n      // Insert any border edges as necessary.\n      iHalfedge = 0, nHalfedges = halfedges.length;\n      while (iHalfedge < nHalfedges) {\n        end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];\n        start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];\n        if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) {\n          halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,\n              Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1]\n              : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1]\n              : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0]\n              : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0]\n              : null)) - 1);\n          ++nHalfedges;\n        }\n      }\n\n      if (nHalfedges) cover = false;\n    }\n  }\n\n  // If there weren’t any edges, have the closest site cover the extent.\n  // It doesn’t matter which corner of the extent we measure!\n  if (cover) {\n    var dx, dy, d2, dc = Infinity;\n\n    for (iCell = 0, cover = null; iCell < nCells; ++iCell) {\n      if (cell = cells[iCell]) {\n        site = cell.site;\n        dx = site[0] - x0;\n        dy = site[1] - y0;\n        d2 = dx * dx + dy * dy;\n        if (d2 < dc) dc = d2, cover = cell;\n      }\n    }\n\n    if (cover) {\n      var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];\n      cover.halfedges.push(\n        edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,\n        edges.push(createBorderEdge(site, v01, v11)) - 1,\n        edges.push(createBorderEdge(site, v11, v10)) - 1,\n        edges.push(createBorderEdge(site, v10, v00)) - 1\n      );\n    }\n  }\n\n  // Lastly delete any cells with no edges; these were entirely clipped.\n  for (iCell = 0; iCell < nCells; ++iCell) {\n    if (cell = cells[iCell]) {\n      if (!cell.halfedges.length) {\n        delete cells[iCell];\n      }\n    }\n  }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {circles, epsilon2} from \"./Diagram\";\n\nvar circlePool = [];\n\nexport var firstCircle;\n\nfunction Circle() {\n  RedBlackNode(this);\n  this.x =\n  this.y =\n  this.arc =\n  this.site =\n  this.cy = null;\n}\n\nexport function attachCircle(arc) {\n  var lArc = arc.P,\n      rArc = arc.N;\n\n  if (!lArc || !rArc) return;\n\n  var lSite = lArc.site,\n      cSite = arc.site,\n      rSite = rArc.site;\n\n  if (lSite === rSite) return;\n\n  var bx = cSite[0],\n      by = cSite[1],\n      ax = lSite[0] - bx,\n      ay = lSite[1] - by,\n      cx = rSite[0] - bx,\n      cy = rSite[1] - by;\n\n  var d = 2 * (ax * cy - ay * cx);\n  if (d >= -epsilon2) return;\n\n  var ha = ax * ax + ay * ay,\n      hc = cx * cx + cy * cy,\n      x = (cy * ha - ay * hc) / d,\n      y = (ax * hc - cx * ha) / d;\n\n  var circle = circlePool.pop() || new Circle;\n  circle.arc = arc;\n  circle.site = cSite;\n  circle.x = x + bx;\n  circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom\n\n  arc.circle = circle;\n\n  var before = null,\n      node = circles._;\n\n  while (node) {\n    if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {\n      if (node.L) node = node.L;\n      else { before = node.P; break; }\n    } else {\n      if (node.R) node = node.R;\n      else { before = node; break; }\n    }\n  }\n\n  circles.insert(before, circle);\n  if (!before) firstCircle = circle;\n}\n\nexport function detachCircle(arc) {\n  var circle = arc.circle;\n  if (circle) {\n    if (!circle.P) firstCircle = circle.N;\n    circles.remove(circle);\n    circlePool.push(circle);\n    RedBlackNode(circle);\n    arc.circle = null;\n  }\n}\n","import {RedBlackNode} from \"./RedBlackTree\";\nimport {createCell} from \"./Cell\";\nimport {attachCircle, detachCircle} from \"./Circle\";\nimport {createEdge, setEdgeEnd} from \"./Edge\";\nimport {beaches, epsilon} from \"./Diagram\";\n\nvar beachPool = [];\n\nfunction Beach() {\n  RedBlackNode(this);\n  this.edge =\n  this.site =\n  this.circle = null;\n}\n\nfunction createBeach(site) {\n  var beach = beachPool.pop() || new Beach;\n  beach.site = site;\n  return beach;\n}\n\nfunction detachBeach(beach) {\n  detachCircle(beach);\n  beaches.remove(beach);\n  beachPool.push(beach);\n  RedBlackNode(beach);\n}\n\nexport function removeBeach(beach) {\n  var circle = beach.circle,\n      x = circle.x,\n      y = circle.cy,\n      vertex = [x, y],\n      previous = beach.P,\n      next = beach.N,\n      disappearing = [beach];\n\n  detachBeach(beach);\n\n  var lArc = previous;\n  while (lArc.circle\n      && Math.abs(x - lArc.circle.x) < epsilon\n      && Math.abs(y - lArc.circle.cy) < epsilon) {\n    previous = lArc.P;\n    disappearing.unshift(lArc);\n    detachBeach(lArc);\n    lArc = previous;\n  }\n\n  disappearing.unshift(lArc);\n  detachCircle(lArc);\n\n  var rArc = next;\n  while (rArc.circle\n      && Math.abs(x - rArc.circle.x) < epsilon\n      && Math.abs(y - rArc.circle.cy) < epsilon) {\n    next = rArc.N;\n    disappearing.push(rArc);\n    detachBeach(rArc);\n    rArc = next;\n  }\n\n  disappearing.push(rArc);\n  detachCircle(rArc);\n\n  var nArcs = disappearing.length,\n      iArc;\n  for (iArc = 1; iArc < nArcs; ++iArc) {\n    rArc = disappearing[iArc];\n    lArc = disappearing[iArc - 1];\n    setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n  }\n\n  lArc = disappearing[0];\n  rArc = disappearing[nArcs - 1];\n  rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);\n\n  attachCircle(lArc);\n  attachCircle(rArc);\n}\n\nexport function addBeach(site) {\n  var x = site[0],\n      directrix = site[1],\n      lArc,\n      rArc,\n      dxl,\n      dxr,\n      node = beaches._;\n\n  while (node) {\n    dxl = leftBreakPoint(node, directrix) - x;\n    if (dxl > epsilon) node = node.L; else {\n      dxr = x - rightBreakPoint(node, directrix);\n      if (dxr > epsilon) {\n        if (!node.R) {\n          lArc = node;\n          break;\n        }\n        node = node.R;\n      } else {\n        if (dxl > -epsilon) {\n          lArc = node.P;\n          rArc = node;\n        } else if (dxr > -epsilon) {\n          lArc = node;\n          rArc = node.N;\n        } else {\n          lArc = rArc = node;\n        }\n        break;\n      }\n    }\n  }\n\n  createCell(site);\n  var newArc = createBeach(site);\n  beaches.insert(lArc, newArc);\n\n  if (!lArc && !rArc) return;\n\n  if (lArc === rArc) {\n    detachCircle(lArc);\n    rArc = createBeach(lArc.site);\n    beaches.insert(newArc, rArc);\n    newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);\n    attachCircle(lArc);\n    attachCircle(rArc);\n    return;\n  }\n\n  if (!rArc) { // && lArc\n    newArc.edge = createEdge(lArc.site, newArc.site);\n    return;\n  }\n\n  // else lArc !== rArc\n  detachCircle(lArc);\n  detachCircle(rArc);\n\n  var lSite = lArc.site,\n      ax = lSite[0],\n      ay = lSite[1],\n      bx = site[0] - ax,\n      by = site[1] - ay,\n      rSite = rArc.site,\n      cx = rSite[0] - ax,\n      cy = rSite[1] - ay,\n      d = 2 * (bx * cy - by * cx),\n      hb = bx * bx + by * by,\n      hc = cx * cx + cy * cy,\n      vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];\n\n  setEdgeEnd(rArc.edge, lSite, rSite, vertex);\n  newArc.edge = createEdge(lSite, site, null, vertex);\n  rArc.edge = createEdge(site, rSite, null, vertex);\n  attachCircle(lArc);\n  attachCircle(rArc);\n}\n\nfunction leftBreakPoint(arc, directrix) {\n  var site = arc.site,\n      rfocx = site[0],\n      rfocy = site[1],\n      pby2 = rfocy - directrix;\n\n  if (!pby2) return rfocx;\n\n  var lArc = arc.P;\n  if (!lArc) return -Infinity;\n\n  site = lArc.site;\n  var lfocx = site[0],\n      lfocy = site[1],\n      plby2 = lfocy - directrix;\n\n  if (!plby2) return lfocx;\n\n  var hl = lfocx - rfocx,\n      aby2 = 1 / pby2 - 1 / plby2,\n      b = hl / plby2;\n\n  if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n\n  return (rfocx + lfocx) / 2;\n}\n\nfunction rightBreakPoint(arc, directrix) {\n  var rArc = arc.N;\n  if (rArc) return leftBreakPoint(rArc, directrix);\n  var site = arc.site;\n  return site[1] === directrix ? site[0] : Infinity;\n}\n","import {addBeach, removeBeach} from \"./Beach\";\nimport {sortCellHalfedges, cellHalfedgeStart, clipCells} from \"./Cell\";\nimport {firstCircle} from \"./Circle\";\nimport {clipEdges} from \"./Edge\";\nimport RedBlackTree from \"./RedBlackTree\";\n\nexport var epsilon = 1e-6;\nexport var epsilon2 = 1e-12;\nexport var beaches;\nexport var cells;\nexport var circles;\nexport var edges;\n\nfunction triangleArea(a, b, c) {\n  return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);\n}\n\nfunction lexicographic(a, b) {\n  return b[1] - a[1]\n      || b[0] - a[0];\n}\n\nexport default function Diagram(sites, extent) {\n  var site = sites.sort(lexicographic).pop(),\n      x,\n      y,\n      circle;\n\n  edges = [];\n  cells = new Array(sites.length);\n  beaches = new RedBlackTree;\n  circles = new RedBlackTree;\n\n  while (true) {\n    circle = firstCircle;\n    if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {\n      if (site[0] !== x || site[1] !== y) {\n        addBeach(site);\n        x = site[0], y = site[1];\n      }\n      site = sites.pop();\n    } else if (circle) {\n      removeBeach(circle.arc);\n    } else {\n      break;\n    }\n  }\n\n  sortCellHalfedges();\n\n  if (extent) {\n    var x0 = +extent[0][0],\n        y0 = +extent[0][1],\n        x1 = +extent[1][0],\n        y1 = +extent[1][1];\n    clipEdges(x0, y0, x1, y1);\n    clipCells(x0, y0, x1, y1);\n  }\n\n  this.edges = edges;\n  this.cells = cells;\n\n  beaches =\n  circles =\n  edges =\n  cells = null;\n}\n\nDiagram.prototype = {\n  constructor: Diagram,\n\n  polygons: function() {\n    var edges = this.edges;\n\n    return this.cells.map(function(cell) {\n      var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });\n      polygon.data = cell.site.data;\n      return polygon;\n    });\n  },\n\n  triangles: function() {\n    var triangles = [],\n        edges = this.edges;\n\n    this.cells.forEach(function(cell, i) {\n      if (!(m = (halfedges = cell.halfedges).length)) return;\n      var site = cell.site,\n          halfedges,\n          j = -1,\n          m,\n          s0,\n          e1 = edges[halfedges[m - 1]],\n          s1 = e1.left === site ? e1.right : e1.left;\n\n      while (++j < m) {\n        s0 = s1;\n        e1 = edges[halfedges[j]];\n        s1 = e1.left === site ? e1.right : e1.left;\n        if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {\n          triangles.push([site.data, s0.data, s1.data]);\n        }\n      }\n    });\n\n    return triangles;\n  },\n\n  links: function() {\n    return this.edges.filter(function(edge) {\n      return edge.right;\n    }).map(function(edge) {\n      return {\n        source: edge.left.data,\n        target: edge.right.data\n      };\n    });\n  },\n\n  find: function(x, y, radius) {\n    var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;\n\n    // Use the previously-found cell, or start with an arbitrary one.\n    while (!(cell = that.cells[i1])) if (++i1 >= n) return null;\n    var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;\n\n    // Traverse the half-edges to find a closer cell, if any.\n    do {\n      cell = that.cells[i0 = i1], i1 = null;\n      cell.halfedges.forEach(function(e) {\n        var edge = that.edges[e], v = edge.left;\n        if ((v === cell.site || !v) && !(v = edge.right)) return;\n        var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;\n        if (v2 < d2) d2 = v2, i1 = v.index;\n      });\n    } while (i1 !== null);\n\n    that._found = i0;\n\n    return radius == null || d2 <= radius * radius ? cell.site : null;\n  }\n}\n","var rho = Math.SQRT2,\n    rho2 = 2,\n    rho4 = 4,\n    epsilon2 = 1e-12;\n\nfunction cosh(x) {\n  return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n  return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n  return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\n// p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\nexport default function(p0, p1) {\n  var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n      ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n      dx = ux1 - ux0,\n      dy = uy1 - uy0,\n      d2 = dx * dx + dy * dy,\n      i,\n      S;\n\n  // Special case for u0 ≅ u1.\n  if (d2 < epsilon2) {\n    S = Math.log(w1 / w0) / rho;\n    i = function(t) {\n      return [\n        ux0 + t * dx,\n        uy0 + t * dy,\n        w0 * Math.exp(rho * t * S)\n      ];\n    }\n  }\n\n  // General case.\n  else {\n    var d1 = Math.sqrt(d2),\n        b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n        b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n        r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n        r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n    S = (r1 - r0) / rho;\n    i = function(t) {\n      var s = t * S,\n          coshr0 = cosh(r0),\n          u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n      return [\n        ux0 + u * dx,\n        uy0 + u * dy,\n        w0 * coshr0 / cosh(rho * s + r0)\n      ];\n    }\n  }\n\n  i.duration = S * 1000;\n\n  return i;\n}\n","export function Transform(k, x, y) {\n  this.k = k;\n  this.x = x;\n  this.y = y;\n}\n\nTransform.prototype = {\n  constructor: Transform,\n  scale: function(k) {\n    return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n  },\n  translate: function(x, y) {\n    return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n  },\n  apply: function(point) {\n    return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n  },\n  applyX: function(x) {\n    return x * this.k + this.x;\n  },\n  applyY: function(y) {\n    return y * this.k + this.y;\n  },\n  invert: function(location) {\n    return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n  },\n  invertX: function(x) {\n    return (x - this.x) / this.k;\n  },\n  invertY: function(y) {\n    return (y - this.y) / this.k;\n  },\n  rescaleX: function(x) {\n    return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n  },\n  rescaleY: function(y) {\n    return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n  },\n  toString: function() {\n    return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n  }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n  while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n  return node.__zoom;\n}\n","export default function(a, b) {\n  return a = +a, b = +b, function(t) {\n    return Math.round(a * (1 - t) + b * t);\n  };\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n *  https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n\n(function(window, document) {\n'use strict';\n\n\n// Exits early if all IntersectionObserver and IntersectionObserverEntry\n// features are natively supported.\nif ('IntersectionObserver' in window &&\n    'IntersectionObserverEntry' in window &&\n    'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n\n  // Minimal polyfill for Edge 15's lack of `isIntersecting`\n  // See: https://github.com/w3c/IntersectionObserver/issues/211\n  if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n    Object.defineProperty(window.IntersectionObserverEntry.prototype,\n      'isIntersecting', {\n      get: function () {\n        return this.intersectionRatio > 0;\n      }\n    });\n  }\n  return;\n}\n\n\n/**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observing a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\nvar registry = [];\n\n\n/**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\nfunction IntersectionObserverEntry(entry) {\n  this.time = entry.time;\n  this.target = entry.target;\n  this.rootBounds = entry.rootBounds;\n  this.boundingClientRect = entry.boundingClientRect;\n  this.intersectionRect = entry.intersectionRect || getEmptyRect();\n  this.isIntersecting = !!entry.intersectionRect;\n\n  // Calculates the intersection ratio.\n  var targetRect = this.boundingClientRect;\n  var targetArea = targetRect.width * targetRect.height;\n  var intersectionRect = this.intersectionRect;\n  var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n  // Sets intersection ratio.\n  if (targetArea) {\n    // Round the intersection ratio to avoid floating point math issues:\n    // https://github.com/w3c/IntersectionObserver/issues/324\n    this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n  } else {\n    // If area is zero and is intersecting, sets to 1, otherwise to 0\n    this.intersectionRatio = this.isIntersecting ? 1 : 0;\n  }\n}\n\n\n/**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n *     changes have queued. The function is not invoked if the queue has\n *     been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\nfunction IntersectionObserver(callback, opt_options) {\n\n  var options = opt_options || {};\n\n  if (typeof callback != 'function') {\n    throw new Error('callback must be a function');\n  }\n\n  if (options.root && options.root.nodeType != 1) {\n    throw new Error('root must be an Element');\n  }\n\n  // Binds and throttles `this._checkForIntersections`.\n  this._checkForIntersections = throttle(\n      this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n  // Private properties.\n  this._callback = callback;\n  this._observationTargets = [];\n  this._queuedEntries = [];\n  this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n  // Public properties.\n  this.thresholds = this._initThresholds(options.threshold);\n  this.root = options.root || null;\n  this.rootMargin = this._rootMarginValues.map(function(margin) {\n    return margin.value + margin.unit;\n  }).join(' ');\n}\n\n\n/**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\nIntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n\n/**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\nIntersectionObserver.prototype.POLL_INTERVAL = null;\n\n/**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\nIntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n\n/**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.observe = function(target) {\n  var isTargetAlreadyObserved = this._observationTargets.some(function(item) {\n    return item.element == target;\n  });\n\n  if (isTargetAlreadyObserved) {\n    return;\n  }\n\n  if (!(target && target.nodeType == 1)) {\n    throw new Error('target must be an Element');\n  }\n\n  this._registerInstance();\n  this._observationTargets.push({element: target, entry: null});\n  this._monitorIntersections();\n  this._checkForIntersections();\n};\n\n\n/**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.unobserve = function(target) {\n  this._observationTargets =\n      this._observationTargets.filter(function(item) {\n\n    return item.element != target;\n  });\n  if (!this._observationTargets.length) {\n    this._unmonitorIntersections();\n    this._unregisterInstance();\n  }\n};\n\n\n/**\n * Stops observing all target elements for intersection changes.\n */\nIntersectionObserver.prototype.disconnect = function() {\n  this._observationTargets = [];\n  this._unmonitorIntersections();\n  this._unregisterInstance();\n};\n\n\n/**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\nIntersectionObserver.prototype.takeRecords = function() {\n  var records = this._queuedEntries.slice();\n  this._queuedEntries = [];\n  return records;\n};\n\n\n/**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n *     a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\nIntersectionObserver.prototype._initThresholds = function(opt_threshold) {\n  var threshold = opt_threshold || [0];\n  if (!Array.isArray(threshold)) threshold = [threshold];\n\n  return threshold.sort().filter(function(t, i, a) {\n    if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n      throw new Error('threshold must be a number between 0 and 1 inclusively');\n    }\n    return t !== a[i - 1];\n  });\n};\n\n\n/**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n *     defaulting to '0px'.\n * @return {Array<Object>} An array of margin objects with the keys\n *     value and unit.\n */\nIntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {\n  var marginString = opt_rootMargin || '0px';\n  var margins = marginString.split(/\\s+/).map(function(margin) {\n    var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n    if (!parts) {\n      throw new Error('rootMargin must be specified in pixels or percent');\n    }\n    return {value: parseFloat(parts[1]), unit: parts[2]};\n  });\n\n  // Handles shorthand.\n  margins[1] = margins[1] || margins[0];\n  margins[2] = margins[2] || margins[0];\n  margins[3] = margins[3] || margins[1];\n\n  return margins;\n};\n\n\n/**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibility state is visible.\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function() {\n  if (!this._monitoringIntersections) {\n    this._monitoringIntersections = true;\n\n    // If a poll interval is set, use polling instead of listening to\n    // resize and scroll events or DOM mutations.\n    if (this.POLL_INTERVAL) {\n      this._monitoringInterval = setInterval(\n          this._checkForIntersections, this.POLL_INTERVAL);\n    }\n    else {\n      addEvent(window, 'resize', this._checkForIntersections, true);\n      addEvent(document, 'scroll', this._checkForIntersections, true);\n\n      if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) {\n        this._domObserver = new MutationObserver(this._checkForIntersections);\n        this._domObserver.observe(document, {\n          attributes: true,\n          childList: true,\n          characterData: true,\n          subtree: true\n        });\n      }\n    }\n  }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function() {\n  if (this._monitoringIntersections) {\n    this._monitoringIntersections = false;\n\n    clearInterval(this._monitoringInterval);\n    this._monitoringInterval = null;\n\n    removeEvent(window, 'resize', this._checkForIntersections, true);\n    removeEvent(document, 'scroll', this._checkForIntersections, true);\n\n    if (this._domObserver) {\n      this._domObserver.disconnect();\n      this._domObserver = null;\n    }\n  }\n};\n\n\n/**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\nIntersectionObserver.prototype._checkForIntersections = function() {\n  var rootIsInDom = this._rootIsInDom();\n  var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n\n  this._observationTargets.forEach(function(item) {\n    var target = item.element;\n    var targetRect = getBoundingClientRect(target);\n    var rootContainsTarget = this._rootContainsTarget(target);\n    var oldEntry = item.entry;\n    var intersectionRect = rootIsInDom && rootContainsTarget &&\n        this._computeTargetAndRootIntersection(target, rootRect);\n\n    var newEntry = item.entry = new IntersectionObserverEntry({\n      time: now(),\n      target: target,\n      boundingClientRect: targetRect,\n      rootBounds: rootRect,\n      intersectionRect: intersectionRect\n    });\n\n    if (!oldEntry) {\n      this._queuedEntries.push(newEntry);\n    } else if (rootIsInDom && rootContainsTarget) {\n      // If the new entry intersection ratio has crossed any of the\n      // thresholds, add a new entry.\n      if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n        this._queuedEntries.push(newEntry);\n      }\n    } else {\n      // If the root is not in the DOM or target is not contained within\n      // root but the previous entry for this target had an intersection,\n      // add a new record indicating removal.\n      if (oldEntry && oldEntry.isIntersecting) {\n        this._queuedEntries.push(newEntry);\n      }\n    }\n  }, this);\n\n  if (this._queuedEntries.length) {\n    this._callback(this.takeRecords(), this);\n  }\n};\n\n\n/**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} rootRect The bounding rect of the root after being\n *     expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n *     intersection is found.\n * @private\n */\nIntersectionObserver.prototype._computeTargetAndRootIntersection =\n    function(target, rootRect) {\n\n  // If the element isn't displayed, an intersection can't happen.\n  if (window.getComputedStyle(target).display == 'none') return;\n\n  var targetRect = getBoundingClientRect(target);\n  var intersectionRect = targetRect;\n  var parent = getParentNode(target);\n  var atRoot = false;\n\n  while (!atRoot) {\n    var parentRect = null;\n    var parentComputedStyle = parent.nodeType == 1 ?\n        window.getComputedStyle(parent) : {};\n\n    // If the parent isn't displayed, an intersection can't happen.\n    if (parentComputedStyle.display == 'none') return;\n\n    if (parent == this.root || parent == document) {\n      atRoot = true;\n      parentRect = rootRect;\n    } else {\n      // If the element has a non-visible overflow, and it's not the <body>\n      // or <html> element, update the intersection rect.\n      // Note: <body> and <html> cannot be clipped to a rect that's not also\n      // the document rect, so no need to compute a new intersection.\n      if (parent != document.body &&\n          parent != document.documentElement &&\n          parentComputedStyle.overflow != 'visible') {\n        parentRect = getBoundingClientRect(parent);\n      }\n    }\n\n    // If either of the above conditionals set a new parentRect,\n    // calculate new intersection data.\n    if (parentRect) {\n      intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n\n      if (!intersectionRect) break;\n    }\n    parent = getParentNode(parent);\n  }\n  return intersectionRect;\n};\n\n\n/**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {Object} The expanded root rect.\n * @private\n */\nIntersectionObserver.prototype._getRootRect = function() {\n  var rootRect;\n  if (this.root) {\n    rootRect = getBoundingClientRect(this.root);\n  } else {\n    // Use <html>/<body> instead of window since scroll bars affect size.\n    var html = document.documentElement;\n    var body = document.body;\n    rootRect = {\n      top: 0,\n      left: 0,\n      right: html.clientWidth || body.clientWidth,\n      width: html.clientWidth || body.clientWidth,\n      bottom: html.clientHeight || body.clientHeight,\n      height: html.clientHeight || body.clientHeight\n    };\n  }\n  return this._expandRectByRootMargin(rootRect);\n};\n\n\n/**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {Object} rect The rect object to expand.\n * @return {Object} The expanded rect.\n * @private\n */\nIntersectionObserver.prototype._expandRectByRootMargin = function(rect) {\n  var margins = this._rootMarginValues.map(function(margin, i) {\n    return margin.unit == 'px' ? margin.value :\n        margin.value * (i % 2 ? rect.width : rect.height) / 100;\n  });\n  var newRect = {\n    top: rect.top - margins[0],\n    right: rect.right + margins[1],\n    bottom: rect.bottom + margins[2],\n    left: rect.left - margins[3]\n  };\n  newRect.width = newRect.right - newRect.left;\n  newRect.height = newRect.bottom - newRect.top;\n\n  return newRect;\n};\n\n\n/**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n *    particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n *    particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\nIntersectionObserver.prototype._hasCrossedThreshold =\n    function(oldEntry, newEntry) {\n\n  // To make comparing easier, an entry that has a ratio of 0\n  // but does not actually intersect is given a value of -1\n  var oldRatio = oldEntry && oldEntry.isIntersecting ?\n      oldEntry.intersectionRatio || 0 : -1;\n  var newRatio = newEntry.isIntersecting ?\n      newEntry.intersectionRatio || 0 : -1;\n\n  // Ignore unchanged ratios\n  if (oldRatio === newRatio) return;\n\n  for (var i = 0; i < this.thresholds.length; i++) {\n    var threshold = this.thresholds[i];\n\n    // Return true if an entry matches a threshold or if the new ratio\n    // and the old ratio are on the opposite sides of a threshold.\n    if (threshold == oldRatio || threshold == newRatio ||\n        threshold < oldRatio !== threshold < newRatio) {\n      return true;\n    }\n  }\n};\n\n\n/**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\nIntersectionObserver.prototype._rootIsInDom = function() {\n  return !this.root || containsDeep(document, this.root);\n};\n\n\n/**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\nIntersectionObserver.prototype._rootContainsTarget = function(target) {\n  return containsDeep(this.root || document, target);\n};\n\n\n/**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\nIntersectionObserver.prototype._registerInstance = function() {\n  if (registry.indexOf(this) < 0) {\n    registry.push(this);\n  }\n};\n\n\n/**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\nIntersectionObserver.prototype._unregisterInstance = function() {\n  var index = registry.indexOf(this);\n  if (index != -1) registry.splice(index, 1);\n};\n\n\n/**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\nfunction now() {\n  return window.performance && performance.now && performance.now();\n}\n\n\n/**\n * Throttles a function and delays its execution, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n *     function can be called again.\n * @return {Function} The throttled function.\n */\nfunction throttle(fn, timeout) {\n  var timer = null;\n  return function () {\n    if (!timer) {\n      timer = setTimeout(function() {\n        fn();\n        timer = null;\n      }, timeout);\n    }\n  };\n}\n\n\n/**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n *     phase. Note: this only works in modern browsers.\n */\nfunction addEvent(node, event, fn, opt_useCapture) {\n  if (typeof node.addEventListener == 'function') {\n    node.addEventListener(event, fn, opt_useCapture || false);\n  }\n  else if (typeof node.attachEvent == 'function') {\n    node.attachEvent('on' + event, fn);\n  }\n}\n\n\n/**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n *     flag set to true, it should be set to true here in order to remove it.\n */\nfunction removeEvent(node, event, fn, opt_useCapture) {\n  if (typeof node.removeEventListener == 'function') {\n    node.removeEventListener(event, fn, opt_useCapture || false);\n  }\n  else if (typeof node.detatchEvent == 'function') {\n    node.detatchEvent('on' + event, fn);\n  }\n}\n\n\n/**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object} The intersection rect or undefined if no intersection\n *     is found.\n */\nfunction computeRectIntersection(rect1, rect2) {\n  var top = Math.max(rect1.top, rect2.top);\n  var bottom = Math.min(rect1.bottom, rect2.bottom);\n  var left = Math.max(rect1.left, rect2.left);\n  var right = Math.min(rect1.right, rect2.right);\n  var width = right - left;\n  var height = bottom - top;\n\n  return (width >= 0 && height >= 0) && {\n    top: top,\n    bottom: bottom,\n    left: left,\n    right: right,\n    width: width,\n    height: height\n  };\n}\n\n\n/**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {Object} The (possibly shimmed) rect of the element.\n */\nfunction getBoundingClientRect(el) {\n  var rect;\n\n  try {\n    rect = el.getBoundingClientRect();\n  } catch (err) {\n    // Ignore Windows 7 IE11 \"Unspecified error\"\n    // https://github.com/w3c/IntersectionObserver/pull/205\n  }\n\n  if (!rect) return getEmptyRect();\n\n  // Older IE\n  if (!(rect.width && rect.height)) {\n    rect = {\n      top: rect.top,\n      right: rect.right,\n      bottom: rect.bottom,\n      left: rect.left,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n  }\n  return rect;\n}\n\n\n/**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {Object} The empty rect.\n */\nfunction getEmptyRect() {\n  return {\n    top: 0,\n    bottom: 0,\n    left: 0,\n    right: 0,\n    width: 0,\n    height: 0\n  };\n}\n\n/**\n * Checks to see if a parent element contains a child element (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\nfunction containsDeep(parent, child) {\n  var node = child;\n  while (node) {\n    if (node == parent) return true;\n\n    node = getParentNode(node);\n  }\n  return false;\n}\n\n\n/**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\nfunction getParentNode(node) {\n  var parent = node.parentNode;\n\n  if (parent && parent.nodeType == 11 && parent.host) {\n    // If the parent is a shadow root, return the host element.\n    return parent.host;\n  }\n  return parent;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}(window, document));\n","import interval from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nvar second = interval(function(date) {\n  date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n  date.setTime(+date + step * durationSecond);\n}, function(start, end) {\n  return (end - start) / durationSecond;\n}, function(date) {\n  return date.getUTCSeconds();\n});\n\nexport default second;\nexport var seconds = second.range;\n","export default function(constructor, factory, prototype) {\n  constructor.prototype = factory.prototype = prototype;\n  prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n  var prototype = Object.create(parent.prototype);\n  for (var key in definition) prototype[key] = definition[key];\n  return prototype;\n}\n","import sourceEvent from \"./sourceEvent\";\nimport point from \"./point\";\n\nexport default function(node, touches, identifier) {\n  if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;\n\n  for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {\n    if ((touch = touches[i]).identifier === identifier) {\n      return point(node, touch);\n    }\n  }\n\n  return null;\n}\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","function none() {}\n\nexport default function(selector) {\n  return selector == null ? none : function() {\n    return this.querySelector(selector);\n  };\n}\n","import namespaces from \"./namespaces\";\n\nexport default function(name) {\n  var prefix = name += \"\", i = prefix.indexOf(\":\");\n  if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n  return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;\n}\n","import interval from \"./interval.js\";\nimport {durationDay} from \"./duration.js\";\n\nvar utcDay = interval(function(date) {\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n  return (end - start) / durationDay;\n}, function(date) {\n  return date.getUTCDate() - 1;\n});\n\nexport default utcDay;\nexport var utcDays = utcDay.range;\n","export var prefix = \"$\";\n\nfunction Map() {}\n\nMap.prototype = map.prototype = {\n  constructor: Map,\n  has: function(key) {\n    return (prefix + key) in this;\n  },\n  get: function(key) {\n    return this[prefix + key];\n  },\n  set: function(key, value) {\n    this[prefix + key] = value;\n    return this;\n  },\n  remove: function(key) {\n    var property = prefix + key;\n    return property in this && delete this[property];\n  },\n  clear: function() {\n    for (var property in this) if (property[0] === prefix) delete this[property];\n  },\n  keys: function() {\n    var keys = [];\n    for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));\n    return keys;\n  },\n  values: function() {\n    var values = [];\n    for (var property in this) if (property[0] === prefix) values.push(this[property]);\n    return values;\n  },\n  entries: function() {\n    var entries = [];\n    for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});\n    return entries;\n  },\n  size: function() {\n    var size = 0;\n    for (var property in this) if (property[0] === prefix) ++size;\n    return size;\n  },\n  empty: function() {\n    for (var property in this) if (property[0] === prefix) return false;\n    return true;\n  },\n  each: function(f) {\n    for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);\n  }\n};\n\nfunction map(object, f) {\n  var map = new Map;\n\n  // Copy constructor.\n  if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });\n\n  // Index array by numeric index or specified key function.\n  else if (Array.isArray(object)) {\n    var i = -1,\n        n = object.length,\n        o;\n\n    if (f == null) while (++i < n) map.set(i, object[i]);\n    else while (++i < n) map.set(f(o = object[i], i, object), o);\n  }\n\n  // Convert object to map.\n  else if (object) for (var key in object) map.set(key, object[key]);\n\n  return map;\n}\n\nexport default map;\n","import map from \"./map\";\n\nexport default function() {\n  var keys = [],\n      sortKeys = [],\n      sortValues,\n      rollup,\n      nest;\n\n  function apply(array, depth, createResult, setResult) {\n    if (depth >= keys.length) {\n      if (sortValues != null) array.sort(sortValues);\n      return rollup != null ? rollup(array) : array;\n    }\n\n    var i = -1,\n        n = array.length,\n        key = keys[depth++],\n        keyValue,\n        value,\n        valuesByKey = map(),\n        values,\n        result = createResult();\n\n    while (++i < n) {\n      if (values = valuesByKey.get(keyValue = key(value = array[i]) + \"\")) {\n        values.push(value);\n      } else {\n        valuesByKey.set(keyValue, [value]);\n      }\n    }\n\n    valuesByKey.each(function(values, key) {\n      setResult(result, key, apply(values, depth, createResult, setResult));\n    });\n\n    return result;\n  }\n\n  function entries(map, depth) {\n    if (++depth > keys.length) return map;\n    var array, sortKey = sortKeys[depth - 1];\n    if (rollup != null && depth >= keys.length) array = map.entries();\n    else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });\n    return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;\n  }\n\n  return nest = {\n    object: function(array) { return apply(array, 0, createObject, setObject); },\n    map: function(array) { return apply(array, 0, createMap, setMap); },\n    entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },\n    key: function(d) { keys.push(d); return nest; },\n    sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },\n    sortValues: function(order) { sortValues = order; return nest; },\n    rollup: function(f) { rollup = f; return nest; }\n  };\n}\n\nfunction createObject() {\n  return {};\n}\n\nfunction setObject(object, key, value) {\n  object[key] = value;\n}\n\nfunction createMap() {\n  return map();\n}\n\nfunction setMap(map, key, value) {\n  map.set(key, value);\n}\n","import {default as map, prefix} from \"./map\";\n\nfunction Set() {}\n\nvar proto = map.prototype;\n\nSet.prototype = set.prototype = {\n  constructor: Set,\n  has: proto.has,\n  add: function(value) {\n    value += \"\";\n    this[prefix + value] = value;\n    return this;\n  },\n  remove: proto.remove,\n  clear: proto.clear,\n  values: proto.keys,\n  size: proto.size,\n  empty: proto.empty,\n  each: proto.each\n};\n\nfunction set(object, f) {\n  var set = new Set;\n\n  // Copy constructor.\n  if (object instanceof Set) object.each(function(value) { set.add(value); });\n\n  // Otherwise, assume it’s an array.\n  else if (object) {\n    var i = -1, n = object.length;\n    if (f == null) while (++i < n) set.add(object[i]);\n    else while (++i < n) set.add(f(object[i], i, object));\n  }\n\n  return set;\n}\n\nexport default set;\n","export default function(map) {\n  var keys = [];\n  for (var key in map) keys.push(key);\n  return keys;\n}\n","import interval from \"./interval.js\";\n\nvar utcYear = interval(function(date) {\n  date.setUTCMonth(0, 1);\n  date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n  return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n  return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n    date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n    date.setUTCMonth(0, 1);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setUTCFullYear(date.getUTCFullYear() + step * k);\n  });\n};\n\nexport default utcYear;\nexport var utcYears = utcYear.range;\n","import interval from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nvar day = interval(function(date) {\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setDate(date.getDate() + step);\n}, function(start, end) {\n  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n  return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","var frame = 0, // is an animation frame pending?\n    timeout = 0, // is a timeout pending?\n    interval = 0, // are any timers active?\n    pokeDelay = 1000, // how frequently we check for clock skew\n    taskHead,\n    taskTail,\n    clockLast = 0,\n    clockNow = 0,\n    clockSkew = 0,\n    clock = typeof performance === \"object\" && performance.now ? performance : Date,\n    setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n  return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n  clockNow = 0;\n}\n\nexport function Timer() {\n  this._call =\n  this._time =\n  this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n  constructor: Timer,\n  restart: function(callback, delay, time) {\n    if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n    time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n    if (!this._next && taskTail !== this) {\n      if (taskTail) taskTail._next = this;\n      else taskHead = this;\n      taskTail = this;\n    }\n    this._call = callback;\n    this._time = time;\n    sleep();\n  },\n  stop: function() {\n    if (this._call) {\n      this._call = null;\n      this._time = Infinity;\n      sleep();\n    }\n  }\n};\n\nexport function timer(callback, delay, time) {\n  var t = new Timer;\n  t.restart(callback, delay, time);\n  return t;\n}\n\nexport function timerFlush() {\n  now(); // Get the current time, if not already set.\n  ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n  var t = taskHead, e;\n  while (t) {\n    if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n    t = t._next;\n  }\n  --frame;\n}\n\nfunction wake() {\n  clockNow = (clockLast = clock.now()) + clockSkew;\n  frame = timeout = 0;\n  try {\n    timerFlush();\n  } finally {\n    frame = 0;\n    nap();\n    clockNow = 0;\n  }\n}\n\nfunction poke() {\n  var now = clock.now(), delay = now - clockLast;\n  if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n  var t0, t1 = taskHead, t2, time = Infinity;\n  while (t1) {\n    if (t1._call) {\n      if (time > t1._time) time = t1._time;\n      t0 = t1, t1 = t1._next;\n    } else {\n      t2 = t1._next, t1._next = null;\n      t1 = t0 ? t0._next = t2 : taskHead = t2;\n    }\n  }\n  taskTail = t0;\n  sleep(time);\n}\n\nfunction sleep(time) {\n  if (frame) return; // Soonest alarm already set, or will be.\n  if (timeout) timeout = clearTimeout(timeout);\n  var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n  if (delay > 24) {\n    if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n    if (interval) interval = clearInterval(interval);\n  } else {\n    if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n    frame = 1, setFrame(wake);\n  }\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n    reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n  return function() {\n    return b;\n  };\n}\n\nfunction one(b) {\n  return function(t) {\n    return b(t) + \"\";\n  };\n}\n\nexport default function(a, b) {\n  var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n      am, // current match in a\n      bm, // current match in b\n      bs, // string preceding current number in b, if any\n      i = -1, // index in s\n      s = [], // string constants and placeholders\n      q = []; // number interpolators\n\n  // Coerce inputs to strings.\n  a = a + \"\", b = b + \"\";\n\n  // Interpolate pairs of numbers in a & b.\n  while ((am = reA.exec(a))\n      && (bm = reB.exec(b))) {\n    if ((bs = bm.index) > bi) { // a string precedes the next number in b\n      bs = b.slice(bi, bs);\n      if (s[i]) s[i] += bs; // coalesce with previous string\n      else s[++i] = bs;\n    }\n    if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n      if (s[i]) s[i] += bm; // coalesce with previous string\n      else s[++i] = bm;\n    } else { // interpolate non-matching numbers\n      s[++i] = null;\n      q.push({i: i, x: number(am, bm)});\n    }\n    bi = reB.lastIndex;\n  }\n\n  // Add remains of b.\n  if (bi < b.length) {\n    bs = b.slice(bi);\n    if (s[i]) s[i] += bs; // coalesce with previous string\n    else s[++i] = bs;\n  }\n\n  // Special optimization for only a single match.\n  // Otherwise, interpolate each of the numbers and rejoin the string.\n  return s.length < 2 ? (q[0]\n      ? one(q[0].x)\n      : zero(b))\n      : (b = q.length, function(t) {\n          for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n          return s.join(\"\");\n        });\n}\n","import interval from \"./interval.js\";\n\nvar month = interval(function(date) {\n  date.setDate(1);\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n  return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n  return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval.js\";\n\nvar year = interval(function(date) {\n  date.setMonth(0, 1);\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n  return end.getFullYear() - start.getFullYear();\n}, function(date) {\n  return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n    date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n    date.setMonth(0, 1);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setFullYear(date.getFullYear() + step * k);\n  });\n};\n\nexport default year;\nexport var years = year.range;\n","export default function(node) {\n  return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n      || (node.document && node) // node is a Window\n      || node.defaultView; // node is a Document\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport default function(x) {\n  return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;\n}\n","// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nexport default function(x, p) {\n  if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n  var i, coefficient = x.slice(0, i);\n\n  // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n  // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n  return [\n    coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n    +x.slice(i + 1)\n  ];\n}\n","export {default as formatDefaultLocale, format, formatPrefix} from \"./defaultLocale.js\";\nexport {default as formatLocale} from \"./locale.js\";\nexport {default as formatSpecifier, FormatSpecifier} from \"./formatSpecifier.js\";\nexport {default as precisionFixed} from \"./precisionFixed.js\";\nexport {default as precisionPrefix} from \"./precisionPrefix.js\";\nexport {default as precisionRound} from \"./precisionRound.js\";\n","import interval from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nvar hour = interval(function(date) {\n  date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, function(date, step) {\n  date.setTime(+date + step * durationHour);\n}, function(start, end) {\n  return (end - start) / durationHour;\n}, function(date) {\n  return date.getHours();\n});\n\nexport default hour;\nexport var hours = hour.range;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n  return function(t) {\n    return a + t * d;\n  };\n}\n\nfunction exponential(a, b, y) {\n  return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n    return Math.pow(a + t * b, y);\n  };\n}\n\nexport function hue(a, b) {\n  var d = b - a;\n  return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n  return (y = +y) === 1 ? nogamma : function(a, b) {\n    return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n  };\n}\n\nexport default function nogamma(a, b) {\n  var d = b - a;\n  return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n  var schedules = node.__transition;\n  if (!schedules) node.__transition = {};\n  else if (id in schedules) return;\n  create(node, id, {\n    name: name,\n    index: index, // For context during callback.\n    group: group, // For context during callback.\n    on: emptyOn,\n    tween: emptyTween,\n    time: timing.time,\n    delay: timing.delay,\n    duration: timing.duration,\n    ease: timing.ease,\n    timer: null,\n    state: CREATED\n  });\n}\n\nexport function init(node, id) {\n  var schedule = get(node, id);\n  if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n  return schedule;\n}\n\nexport function set(node, id) {\n  var schedule = get(node, id);\n  if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n  return schedule;\n}\n\nexport function get(node, id) {\n  var schedule = node.__transition;\n  if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n  return schedule;\n}\n\nfunction create(node, id, self) {\n  var schedules = node.__transition,\n      tween;\n\n  // Initialize the self timer when the transition is created.\n  // Note the actual delay is not known until the first callback!\n  schedules[id] = self;\n  self.timer = timer(schedule, 0, self.time);\n\n  function schedule(elapsed) {\n    self.state = SCHEDULED;\n    self.timer.restart(start, self.delay, self.time);\n\n    // If the elapsed delay is less than our first sleep, start immediately.\n    if (self.delay <= elapsed) start(elapsed - self.delay);\n  }\n\n  function start(elapsed) {\n    var i, j, n, o;\n\n    // If the state is not SCHEDULED, then we previously errored on start.\n    if (self.state !== SCHEDULED) return stop();\n\n    for (i in schedules) {\n      o = schedules[i];\n      if (o.name !== self.name) continue;\n\n      // While this element already has a starting transition during this frame,\n      // defer starting an interrupting transition until that transition has a\n      // chance to tick (and possibly end); see d3/d3-transition#54!\n      if (o.state === STARTED) return timeout(start);\n\n      // Interrupt the active transition, if any.\n      if (o.state === RUNNING) {\n        o.state = ENDED;\n        o.timer.stop();\n        o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n        delete schedules[i];\n      }\n\n      // Cancel any pre-empted transitions.\n      else if (+i < id) {\n        o.state = ENDED;\n        o.timer.stop();\n        o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n        delete schedules[i];\n      }\n    }\n\n    // Defer the first tick to end of the current frame; see d3/d3#1576.\n    // Note the transition may be canceled after start and before the first tick!\n    // Note this must be scheduled before the start event; see d3/d3-transition#16!\n    // Assuming this is successful, subsequent callbacks go straight to tick.\n    timeout(function() {\n      if (self.state === STARTED) {\n        self.state = RUNNING;\n        self.timer.restart(tick, self.delay, self.time);\n        tick(elapsed);\n      }\n    });\n\n    // Dispatch the start event.\n    // Note this must be done before the tween are initialized.\n    self.state = STARTING;\n    self.on.call(\"start\", node, node.__data__, self.index, self.group);\n    if (self.state !== STARTING) return; // interrupted\n    self.state = STARTED;\n\n    // Initialize the tween, deleting null tween.\n    tween = new Array(n = self.tween.length);\n    for (i = 0, j = -1; i < n; ++i) {\n      if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n        tween[++j] = o;\n      }\n    }\n    tween.length = j + 1;\n  }\n\n  function tick(elapsed) {\n    var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n        i = -1,\n        n = tween.length;\n\n    while (++i < n) {\n      tween[i].call(node, t);\n    }\n\n    // Dispatch the end event.\n    if (self.state === ENDING) {\n      self.on.call(\"end\", node, node.__data__, self.index, self.group);\n      stop();\n    }\n  }\n\n  function stop() {\n    self.state = ENDED;\n    self.timer.stop();\n    delete schedules[id];\n    for (var i in schedules) return; // eslint-disable-line no-unused-vars\n    delete node.__transition;\n  }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n  var schedules = node.__transition,\n      schedule,\n      active,\n      empty = true,\n      i;\n\n  if (!schedules) return;\n\n  name = name == null ? null : name + \"\";\n\n  for (i in schedules) {\n    if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n    active = schedule.state > STARTING && schedule.state < ENDING;\n    schedule.state = ENDED;\n    schedule.timer.stop();\n    schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n    delete schedules[i];\n  }\n\n  if (empty) delete node.__transition;\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar cssNode,\n    cssRoot,\n    cssView,\n    svgNode;\n\nexport function parseCss(value) {\n  if (value === \"none\") return identity;\n  if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n  cssNode.style.transform = value;\n  value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n  cssRoot.removeChild(cssNode);\n  value = value.slice(7, -1).split(\",\");\n  return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nexport function parseSvg(value) {\n  if (value == null) return identity;\n  if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n  svgNode.setAttribute(\"transform\", value);\n  if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n  value = value.matrix;\n  return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n  translateX: 0,\n  translateY: 0,\n  rotate: 0,\n  skewX: 0,\n  scaleX: 1,\n  scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n  var scaleX, scaleY, skewX;\n  if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n  if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n  if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n  if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n  return {\n    translateX: e,\n    translateY: f,\n    rotate: Math.atan2(b, a) * degrees,\n    skewX: Math.atan(skewX) * degrees,\n    scaleX: scaleX,\n    scaleY: scaleY\n  };\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n  function pop(s) {\n    return s.length ? s.pop() + \" \" : \"\";\n  }\n\n  function translate(xa, ya, xb, yb, s, q) {\n    if (xa !== xb || ya !== yb) {\n      var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n      q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n    } else if (xb || yb) {\n      s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n    }\n  }\n\n  function rotate(a, b, s, q) {\n    if (a !== b) {\n      if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n      q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n    } else if (b) {\n      s.push(pop(s) + \"rotate(\" + b + degParen);\n    }\n  }\n\n  function skewX(a, b, s, q) {\n    if (a !== b) {\n      q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n    } else if (b) {\n      s.push(pop(s) + \"skewX(\" + b + degParen);\n    }\n  }\n\n  function scale(xa, ya, xb, yb, s, q) {\n    if (xa !== xb || ya !== yb) {\n      var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n      q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n    } else if (xb !== 1 || yb !== 1) {\n      s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n    }\n  }\n\n  return function(a, b) {\n    var s = [], // string constants and placeholders\n        q = []; // number interpolators\n    a = parse(a), b = parse(b);\n    translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n    rotate(a.rotate, b.rotate, s, q);\n    skewX(a.skewX, b.skewX, s, q);\n    scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n    a = b = null; // gc\n    return function(t) {\n      var i = -1, n = q.length, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n  var tween0, tween1;\n  return function() {\n    var schedule = set(this, id),\n        tween = schedule.tween;\n\n    // If this node shared tween with the previous node,\n    // just assign the updated shared tween and we’re done!\n    // Otherwise, copy-on-write.\n    if (tween !== tween0) {\n      tween1 = tween0 = tween;\n      for (var i = 0, n = tween1.length; i < n; ++i) {\n        if (tween1[i].name === name) {\n          tween1 = tween1.slice();\n          tween1.splice(i, 1);\n          break;\n        }\n      }\n    }\n\n    schedule.tween = tween1;\n  };\n}\n\nfunction tweenFunction(id, name, value) {\n  var tween0, tween1;\n  if (typeof value !== \"function\") throw new Error;\n  return function() {\n    var schedule = set(this, id),\n        tween = schedule.tween;\n\n    // If this node shared tween with the previous node,\n    // just assign the updated shared tween and we’re done!\n    // Otherwise, copy-on-write.\n    if (tween !== tween0) {\n      tween1 = (tween0 = tween).slice();\n      for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n        if (tween1[i].name === name) {\n          tween1[i] = t;\n          break;\n        }\n      }\n      if (i === n) tween1.push(t);\n    }\n\n    schedule.tween = tween1;\n  };\n}\n\nexport default function(name, value) {\n  var id = this._id;\n\n  name += \"\";\n\n  if (arguments.length < 2) {\n    var tween = get(this.node(), id).tween;\n    for (var i = 0, n = tween.length, t; i < n; ++i) {\n      if ((t = tween[i]).name === name) {\n        return t.value;\n      }\n    }\n    return null;\n  }\n\n  return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n  var id = transition._id;\n\n  transition.each(function() {\n    var schedule = set(this, id);\n    (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n  });\n\n  return function(node) {\n    return get(node, id).value[name];\n  };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n  var c;\n  return (typeof b === \"number\" ? interpolateNumber\n      : b instanceof color ? interpolateRgb\n      : (c = color(b)) ? (b = c, interpolateRgb)\n      : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n  return function() {\n    this.removeAttribute(name);\n  };\n}\n\nfunction attrRemoveNS(fullname) {\n  return function() {\n    this.removeAttributeNS(fullname.space, fullname.local);\n  };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n  var string00,\n      string1 = value1 + \"\",\n      interpolate0;\n  return function() {\n    var string0 = this.getAttribute(name);\n    return string0 === string1 ? null\n        : string0 === string00 ? interpolate0\n        : interpolate0 = interpolate(string00 = string0, value1);\n  };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n  var string00,\n      string1 = value1 + \"\",\n      interpolate0;\n  return function() {\n    var string0 = this.getAttributeNS(fullname.space, fullname.local);\n    return string0 === string1 ? null\n        : string0 === string00 ? interpolate0\n        : interpolate0 = interpolate(string00 = string0, value1);\n  };\n}\n\nfunction attrFunction(name, interpolate, value) {\n  var string00,\n      string10,\n      interpolate0;\n  return function() {\n    var string0, value1 = value(this), string1;\n    if (value1 == null) return void this.removeAttribute(name);\n    string0 = this.getAttribute(name);\n    string1 = value1 + \"\";\n    return string0 === string1 ? null\n        : string0 === string00 && string1 === string10 ? interpolate0\n        : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n  };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n  var string00,\n      string10,\n      interpolate0;\n  return function() {\n    var string0, value1 = value(this), string1;\n    if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n    string0 = this.getAttributeNS(fullname.space, fullname.local);\n    string1 = value1 + \"\";\n    return string0 === string1 ? null\n        : string0 === string00 && string1 === string10 ? interpolate0\n        : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n  };\n}\n\nexport default function(name, value) {\n  var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n  return this.attrTween(name, typeof value === \"function\"\n      ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n      : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n      : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n  return function(t) {\n    this.setAttribute(name, i.call(this, t));\n  };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n  return function(t) {\n    this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n  };\n}\n\nfunction attrTweenNS(fullname, value) {\n  var t0, i0;\n  function tween() {\n    var i = value.apply(this, arguments);\n    if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n    return t0;\n  }\n  tween._value = value;\n  return tween;\n}\n\nfunction attrTween(name, value) {\n  var t0, i0;\n  function tween() {\n    var i = value.apply(this, arguments);\n    if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n    return t0;\n  }\n  tween._value = value;\n  return tween;\n}\n\nexport default function(name, value) {\n  var key = \"attr.\" + name;\n  if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n  if (value == null) return this.tween(key, null);\n  if (typeof value !== \"function\") throw new Error;\n  var fullname = namespace(name);\n  return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n  return function() {\n    init(this, id).delay = +value.apply(this, arguments);\n  };\n}\n\nfunction delayConstant(id, value) {\n  return value = +value, function() {\n    init(this, id).delay = value;\n  };\n}\n\nexport default function(value) {\n  var id = this._id;\n\n  return arguments.length\n      ? this.each((typeof value === \"function\"\n          ? delayFunction\n          : delayConstant)(id, value))\n      : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n  return function() {\n    set(this, id).duration = +value.apply(this, arguments);\n  };\n}\n\nfunction durationConstant(id, value) {\n  return value = +value, function() {\n    set(this, id).duration = value;\n  };\n}\n\nexport default function(value) {\n  var id = this._id;\n\n  return arguments.length\n      ? this.each((typeof value === \"function\"\n          ? durationFunction\n          : durationConstant)(id, value))\n      : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n  if (typeof value !== \"function\") throw new Error;\n  return function() {\n    set(this, id).ease = value;\n  };\n}\n\nexport default function(value) {\n  var id = this._id;\n\n  return arguments.length\n      ? this.each(easeConstant(id, value))\n      : get(this.node(), id).ease;\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n  return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n    var i = t.indexOf(\".\");\n    if (i >= 0) t = t.slice(0, i);\n    return !t || t === \"start\";\n  });\n}\n\nfunction onFunction(id, name, listener) {\n  var on0, on1, sit = start(name) ? init : set;\n  return function() {\n    var schedule = sit(this, id),\n        on = schedule.on;\n\n    // If this node shared a dispatch with the previous node,\n    // just assign the updated shared dispatch and we’re done!\n    // Otherwise, copy-on-write.\n    if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n    schedule.on = on1;\n  };\n}\n\nexport default function(name, listener) {\n  var id = this._id;\n\n  return arguments.length < 2\n      ? get(this.node(), id).on.on(name)\n      : this.each(onFunction(id, name, listener));\n}\n","function removeFunction(id) {\n  return function() {\n    var parent = this.parentNode;\n    for (var i in this.__transition) if (+i !== id) return;\n    if (parent) parent.removeChild(this);\n  };\n}\n\nexport default function() {\n  return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n  return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n  var string00,\n      string10,\n      interpolate0;\n  return function() {\n    var string0 = style(this, name),\n        string1 = (this.style.removeProperty(name), style(this, name));\n    return string0 === string1 ? null\n        : string0 === string00 && string1 === string10 ? interpolate0\n        : interpolate0 = interpolate(string00 = string0, string10 = string1);\n  };\n}\n\nfunction styleRemove(name) {\n  return function() {\n    this.style.removeProperty(name);\n  };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n  var string00,\n      string1 = value1 + \"\",\n      interpolate0;\n  return function() {\n    var string0 = style(this, name);\n    return string0 === string1 ? null\n        : string0 === string00 ? interpolate0\n        : interpolate0 = interpolate(string00 = string0, value1);\n  };\n}\n\nfunction styleFunction(name, interpolate, value) {\n  var string00,\n      string10,\n      interpolate0;\n  return function() {\n    var string0 = style(this, name),\n        value1 = value(this),\n        string1 = value1 + \"\";\n    if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n    return string0 === string1 ? null\n        : string0 === string00 && string1 === string10 ? interpolate0\n        : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n  };\n}\n\nfunction styleMaybeRemove(id, name) {\n  var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n  return function() {\n    var schedule = set(this, id),\n        on = schedule.on,\n        listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n    // If this node shared a dispatch with the previous node,\n    // just assign the updated shared dispatch and we’re done!\n    // Otherwise, copy-on-write.\n    if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n    schedule.on = on1;\n  };\n}\n\nexport default function(name, value, priority) {\n  var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n  return value == null ? this\n      .styleTween(name, styleNull(name, i))\n      .on(\"end.style.\" + name, styleRemove(name))\n    : typeof value === \"function\" ? this\n      .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n      .each(styleMaybeRemove(this._id, name))\n    : this\n      .styleTween(name, styleConstant(name, i, value), priority)\n      .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n  return function(t) {\n    this.style.setProperty(name, i.call(this, t), priority);\n  };\n}\n\nfunction styleTween(name, value, priority) {\n  var t, i0;\n  function tween() {\n    var i = value.apply(this, arguments);\n    if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n    return t;\n  }\n  tween._value = value;\n  return tween;\n}\n\nexport default function(name, value, priority) {\n  var key = \"style.\" + (name += \"\");\n  if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n  if (value == null) return this.tween(key, null);\n  if (typeof value !== \"function\") throw new Error;\n  return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","function textInterpolate(i) {\n  return function(t) {\n    this.textContent = i.call(this, t);\n  };\n}\n\nfunction textTween(value) {\n  var t0, i0;\n  function tween() {\n    var i = value.apply(this, arguments);\n    if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n    return t0;\n  }\n  tween._value = value;\n  return tween;\n}\n\nexport default function(value) {\n  var key = \"text\";\n  if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n  if (value == null) return this.tween(key, null);\n  if (typeof value !== \"function\") throw new Error;\n  return this.tween(key, textTween(value));\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n  this._groups = groups;\n  this._parents = parents;\n  this._name = name;\n  this._id = id;\n}\n\nexport default function transition(name) {\n  return selection().transition(name);\n}\n\nexport function newId() {\n  return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n  constructor: Transition,\n  select: transition_select,\n  selectAll: transition_selectAll,\n  filter: transition_filter,\n  merge: transition_merge,\n  selection: transition_selection,\n  transition: transition_transition,\n  call: selection_prototype.call,\n  nodes: selection_prototype.nodes,\n  node: selection_prototype.node,\n  size: selection_prototype.size,\n  empty: selection_prototype.empty,\n  each: selection_prototype.each,\n  on: transition_on,\n  attr: transition_attr,\n  attrTween: transition_attrTween,\n  style: transition_style,\n  styleTween: transition_styleTween,\n  text: transition_text,\n  textTween: transition_textTween,\n  remove: transition_remove,\n  tween: transition_tween,\n  delay: transition_delay,\n  duration: transition_duration,\n  ease: transition_ease,\n  end: transition_end\n};\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n  var name = this._name,\n      id = this._id;\n\n  if (typeof select !== \"function\") select = selector(select);\n\n  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n      if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n        if (\"__data__\" in node) subnode.__data__ = node.__data__;\n        subgroup[i] = subnode;\n        schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n      }\n    }\n  }\n\n  return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n  var name = this._name,\n      id = this._id;\n\n  if (typeof select !== \"function\") select = selectorAll(select);\n\n  for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n      if (node = group[i]) {\n        for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n          if (child = children[k]) {\n            schedule(child, name, id, k, children, inherit);\n          }\n        }\n        subgroups.push(children);\n        parents.push(node);\n      }\n    }\n  }\n\n  return new Transition(subgroups, parents, name, id);\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n  if (typeof match !== \"function\") match = matcher(match);\n\n  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n      if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n        subgroup.push(node);\n      }\n    }\n  }\n\n  return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n  if (transition._id !== this._id) throw new Error;\n\n  for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n    for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n      if (node = group0[i] || group1[i]) {\n        merge[i] = node;\n      }\n    }\n  }\n\n  for (; j < m0; ++j) {\n    merges[j] = groups0[j];\n  }\n\n  return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n  var name = this._name,\n      id0 = this._id,\n      id1 = newId();\n\n  for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n      if (node = group[i]) {\n        var inherit = get(node, id0);\n        schedule(node, name, id1, i, group, {\n          time: inherit.time + inherit.delay + inherit.duration,\n          delay: 0,\n          duration: inherit.duration,\n          ease: inherit.ease\n        });\n      }\n    }\n  }\n\n  return new Transition(groups, this._parents, name, id1);\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n  return function() {\n    this.textContent = value;\n  };\n}\n\nfunction textFunction(value) {\n  return function() {\n    var value1 = value(this);\n    this.textContent = value1 == null ? \"\" : value1;\n  };\n}\n\nexport default function(value) {\n  return this.tween(\"text\", typeof value === \"function\"\n      ? textFunction(tweenValue(this, \"text\", value))\n      : textConstant(value == null ? \"\" : value + \"\"));\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n  var on0, on1, that = this, id = that._id, size = that.size();\n  return new Promise(function(resolve, reject) {\n    var cancel = {value: reject},\n        end = {value: function() { if (--size === 0) resolve(); }};\n\n    that.each(function() {\n      var schedule = set(this, id),\n          on = schedule.on;\n\n      // If this node shared a dispatch with the previous node,\n      // just assign the updated shared dispatch and we’re done!\n      // Otherwise, copy-on-write.\n      if (on !== on0) {\n        on1 = (on0 = on).copy();\n        on1._.cancel.push(cancel);\n        on1._.interrupt.push(cancel);\n        on1._.end.push(end);\n      }\n\n      schedule.on = on1;\n    });\n  });\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n  time: null, // Set on use.\n  delay: 0,\n  duration: 250,\n  ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n  var timing;\n  while (!(timing = node.__transition) || !(timing = timing[id])) {\n    if (!(node = node.parentNode)) {\n      return defaultTiming.time = now(), defaultTiming;\n    }\n  }\n  return timing;\n}\n\nexport default function(name) {\n  var id,\n      timing;\n\n  if (name instanceof Transition) {\n    id = name._id, name = name._name;\n  } else {\n    id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n  }\n\n  for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n      if (node = group[i]) {\n        schedule(node, name, id, i, group, timing || inherit(node, id));\n      }\n    }\n  }\n\n  return new Transition(groups, this._parents, name, id);\n}\n","export function cubicIn(t) {\n  return t * t * t;\n}\n\nexport function cubicOut(t) {\n  return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n  return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n  return this.each(function() {\n    interrupt(this, name);\n  });\n}\n","import interval from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction weekday(i) {\n  return interval(function(date) {\n    date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setDate(date.getDate() + step * 7);\n  }, function(start, end) {\n    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n  });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n  var d = formatDecimal(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1],\n      i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n      n = coefficient.length;\n  return i === n ? coefficient\n      : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n      : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n      : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import formatDecimal from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n  var d = formatDecimal(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1];\n  return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n      : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n      : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n  \"%\": function(x, p) { return (x * 100).toFixed(p); },\n  \"b\": function(x) { return Math.round(x).toString(2); },\n  \"c\": function(x) { return x + \"\"; },\n  \"d\": function(x) { return Math.round(x).toString(10); },\n  \"e\": function(x, p) { return x.toExponential(p); },\n  \"f\": function(x, p) { return x.toFixed(p); },\n  \"g\": function(x, p) { return x.toPrecision(p); },\n  \"o\": function(x) { return Math.round(x).toString(8); },\n  \"p\": function(x, p) { return formatRounded(x * 100, p); },\n  \"r\": formatRounded,\n  \"s\": formatPrefixAuto,\n  \"X\": function(x) { return Math.round(x).toString(16).toUpperCase(); },\n  \"x\": function(x) { return Math.round(x).toString(16); }\n};\n","export default function(x) {\n  return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n    prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n  var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n      currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n      currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n      decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n      numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n      percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n      minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n      nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n  function newFormat(specifier) {\n    specifier = formatSpecifier(specifier);\n\n    var fill = specifier.fill,\n        align = specifier.align,\n        sign = specifier.sign,\n        symbol = specifier.symbol,\n        zero = specifier.zero,\n        width = specifier.width,\n        comma = specifier.comma,\n        precision = specifier.precision,\n        trim = specifier.trim,\n        type = specifier.type;\n\n    // The \"n\" type is an alias for \",g\".\n    if (type === \"n\") comma = true, type = \"g\";\n\n    // The \"\" type, and any invalid type, is an alias for \".12~g\".\n    else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n    // If zero fill is specified, padding goes after sign and before digits.\n    if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n    // Compute the prefix and suffix.\n    // For SI-prefix, the suffix is lazily computed.\n    var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n        suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n    // What format function should we use?\n    // Is this an integer type?\n    // Can this type generate exponential notation?\n    var formatType = formatTypes[type],\n        maybeSuffix = /[defgprs%]/.test(type);\n\n    // Set the default precision if not specified,\n    // or clamp the specified precision to the supported range.\n    // For significant precision, it must be in [1, 21].\n    // For fixed precision, it must be in [0, 20].\n    precision = precision === undefined ? 6\n        : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n        : Math.max(0, Math.min(20, precision));\n\n    function format(value) {\n      var valuePrefix = prefix,\n          valueSuffix = suffix,\n          i, n, c;\n\n      if (type === \"c\") {\n        valueSuffix = formatType(value) + valueSuffix;\n        value = \"\";\n      } else {\n        value = +value;\n\n        // Perform the initial formatting.\n        var valueNegative = value < 0;\n        value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n        // Trim insignificant zeros.\n        if (trim) value = formatTrim(value);\n\n        // If a negative value rounds to zero during formatting, treat as positive.\n        if (valueNegative && +value === 0) valueNegative = false;\n\n        // Compute the prefix and suffix.\n        valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n\n        valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n        // Break the formatted value into the integer “value” part that can be\n        // grouped, and fractional or exponential “suffix” part that is not.\n        if (maybeSuffix) {\n          i = -1, n = value.length;\n          while (++i < n) {\n            if (c = value.charCodeAt(i), 48 > c || c > 57) {\n              valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n              value = value.slice(0, i);\n              break;\n            }\n          }\n        }\n      }\n\n      // If the fill character is not \"0\", grouping is applied before padding.\n      if (comma && !zero) value = group(value, Infinity);\n\n      // Compute the padding.\n      var length = valuePrefix.length + value.length + valueSuffix.length,\n          padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n      // If the fill character is \"0\", grouping is applied after padding.\n      if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n      // Reconstruct the final output based on the desired alignment.\n      switch (align) {\n        case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n        case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n        case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n        default: value = padding + valuePrefix + value + valueSuffix; break;\n      }\n\n      return numerals(value);\n    }\n\n    format.toString = function() {\n      return specifier + \"\";\n    };\n\n    return format;\n  }\n\n  function formatPrefix(specifier, value) {\n    var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n        e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n        k = Math.pow(10, -e),\n        prefix = prefixes[8 + e / 3];\n    return function(value) {\n      return f(k * value) + prefix;\n    };\n  }\n\n  return {\n    format: newFormat,\n    formatPrefix: formatPrefix\n  };\n}\n","export default function(grouping, thousands) {\n  return function(value, width) {\n    var i = value.length,\n        t = [],\n        j = 0,\n        g = grouping[0],\n        length = 0;\n\n    while (i > 0 && g > 0) {\n      if (length + g + 1 > width) g = Math.max(1, width - length);\n      t.push(value.substring(i -= g, i + g));\n      if ((length += g + 1) > width) break;\n      g = grouping[j = (j + 1) % grouping.length];\n    }\n\n    return t.reverse().join(thousands);\n  };\n}\n","export default function(numerals) {\n  return function(value) {\n    return value.replace(/[0-9]/g, function(i) {\n      return numerals[+i];\n    });\n  };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n  out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n    switch (s[i]) {\n      case \".\": i0 = i1 = i; break;\n      case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n      default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n    }\n  }\n  return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","export default function(a, b) {\n  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n  if (compare.length === 1) compare = ascendingComparator(compare);\n  return {\n    left: function(a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) < 0) lo = mid + 1;\n        else hi = mid;\n      }\n      return lo;\n    },\n    right: function(a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) > 0) hi = mid;\n        else lo = mid + 1;\n      }\n      return lo;\n    }\n  };\n}\n\nfunction ascendingComparator(f) {\n  return function(d, x) {\n    return ascending(f(d), x);\n  };\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import {pair} from \"./pairs\";\n\nexport default function(values0, values1, reduce) {\n  var n0 = values0.length,\n      n1 = values1.length,\n      values = new Array(n0 * n1),\n      i0,\n      i1,\n      i,\n      value0;\n\n  if (reduce == null) reduce = pair;\n\n  for (i0 = i = 0; i0 < n0; ++i0) {\n    for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n      values[i] = reduce(value0, values1[i1]);\n    }\n  }\n\n  return values;\n}\n","export default function(x) {\n  return x === null ? NaN : +x;\n}\n","export default function(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      min,\n      max;\n\n  if (valueof == null) {\n    while (++i < n) { // Find the first comparable value.\n      if ((value = values[i]) != null && value >= value) {\n        min = max = value;\n        while (++i < n) { // Compare the remaining values.\n          if ((value = values[i]) != null) {\n            if (min > value) min = value;\n            if (max < value) max = value;\n          }\n        }\n      }\n    }\n  }\n\n  else {\n    while (++i < n) { // Find the first comparable value.\n      if ((value = valueof(values[i], i, values)) != null && value >= value) {\n        min = max = value;\n        while (++i < n) { // Compare the remaining values.\n          if ((value = valueof(values[i], i, values)) != null) {\n            if (min > value) min = value;\n            if (max < value) max = value;\n          }\n        }\n      }\n    }\n  }\n\n  return [min, max];\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","export default function(start, stop, step) {\n  start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n\n  var i = -1,\n      n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n      range = new Array(n);\n\n  while (++i < n) {\n    range[i] = start + i * step;\n  }\n\n  return range;\n}\n","var e10 = Math.sqrt(50),\n    e5 = Math.sqrt(10),\n    e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n  var reverse,\n      i = -1,\n      n,\n      ticks,\n      step;\n\n  stop = +stop, start = +start, count = +count;\n  if (start === stop && count > 0) return [start];\n  if (reverse = stop < start) n = start, start = stop, stop = n;\n  if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n  if (step > 0) {\n    start = Math.ceil(start / step);\n    stop = Math.floor(stop / step);\n    ticks = new Array(n = Math.ceil(stop - start + 1));\n    while (++i < n) ticks[i] = (start + i) * step;\n  } else {\n    start = Math.floor(start * step);\n    stop = Math.ceil(stop * step);\n    ticks = new Array(n = Math.ceil(start - stop + 1));\n    while (++i < n) ticks[i] = (start - i) / step;\n  }\n\n  if (reverse) ticks.reverse();\n\n  return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n  var step = (stop - start) / Math.max(0, count),\n      power = Math.floor(Math.log(step) / Math.LN10),\n      error = step / Math.pow(10, power);\n  return power >= 0\n      ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n      : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n  var step0 = Math.abs(stop - start) / Math.max(0, count),\n      step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n      error = step0 / step1;\n  if (error >= e10) step1 *= 10;\n  else if (error >= e5) step1 *= 5;\n  else if (error >= e2) step1 *= 2;\n  return stop < start ? -step1 : step1;\n}\n","export default function(values) {\n  return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n","import number from \"./number\";\n\nexport default function(values, p, valueof) {\n  if (valueof == null) valueof = number;\n  if (!(n = values.length)) return;\n  if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n  if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n  var n,\n      i = (n - 1) * p,\n      i0 = Math.floor(i),\n      value0 = +valueof(values[i0], i0, values),\n      value1 = +valueof(values[i0 + 1], i0 + 1, values);\n  return value0 + (value1 - value0) * (i - i0);\n}\n","export default function(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      max;\n\n  if (valueof == null) {\n    while (++i < n) { // Find the first comparable value.\n      if ((value = values[i]) != null && value >= value) {\n        max = value;\n        while (++i < n) { // Compare the remaining values.\n          if ((value = values[i]) != null && value > max) {\n            max = value;\n          }\n        }\n      }\n    }\n  }\n\n  else {\n    while (++i < n) { // Find the first comparable value.\n      if ((value = valueof(values[i], i, values)) != null && value >= value) {\n        max = value;\n        while (++i < n) { // Compare the remaining values.\n          if ((value = valueof(values[i], i, values)) != null && value > max) {\n            max = value;\n          }\n        }\n      }\n    }\n  }\n\n  return max;\n}\n","export default function(arrays) {\n  var n = arrays.length,\n      m,\n      i = -1,\n      j = 0,\n      merged,\n      array;\n\n  while (++i < n) j += arrays[i].length;\n  merged = new Array(j);\n\n  while (--n >= 0) {\n    array = arrays[n];\n    m = array.length;\n    while (--m >= 0) {\n      merged[--j] = array[m];\n    }\n  }\n\n  return merged;\n}\n","export default function(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      min;\n\n  if (valueof == null) {\n    while (++i < n) { // Find the first comparable value.\n      if ((value = values[i]) != null && value >= value) {\n        min = value;\n        while (++i < n) { // Compare the remaining values.\n          if ((value = values[i]) != null && min > value) {\n            min = value;\n          }\n        }\n      }\n    }\n  }\n\n  else {\n    while (++i < n) { // Find the first comparable value.\n      if ((value = valueof(values[i], i, values)) != null && value >= value) {\n        min = value;\n        while (++i < n) { // Compare the remaining values.\n          if ((value = valueof(values[i], i, values)) != null && min > value) {\n            min = value;\n          }\n        }\n      }\n    }\n  }\n\n  return min;\n}\n","export default function(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      sum = 0;\n\n  if (valueof == null) {\n    while (++i < n) {\n      if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\n    }\n  }\n\n  else {\n    while (++i < n) {\n      if (value = +valueof(values[i], i, values)) sum += value;\n    }\n  }\n\n  return sum;\n}\n","import dsv from \"./dsv.js\";\n\nvar tsv = dsv(\"\\t\");\n\nexport var tsvParse = tsv.parse;\nexport var tsvParseRows = tsv.parseRows;\nexport var tsvFormat = tsv.format;\nexport var tsvFormatBody = tsv.formatBody;\nexport var tsvFormatRows = tsv.formatRows;\nexport var tsvFormatRow = tsv.formatRow;\nexport var tsvFormatValue = tsv.formatValue;\n","var noop = {value: function() {}};\n\nfunction dispatch() {\n  for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n    if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n    _[t] = [];\n  }\n  return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n  this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n  return typenames.trim().split(/^|\\s+/).map(function(t) {\n    var name = \"\", i = t.indexOf(\".\");\n    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n    if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n    return {type: t, name: name};\n  });\n}\n\nDispatch.prototype = dispatch.prototype = {\n  constructor: Dispatch,\n  on: function(typename, callback) {\n    var _ = this._,\n        T = parseTypenames(typename + \"\", _),\n        t,\n        i = -1,\n        n = T.length;\n\n    // If no callback was specified, return the callback of the given type and name.\n    if (arguments.length < 2) {\n      while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n      return;\n    }\n\n    // If a type was specified, set the callback for the given type and name.\n    // Otherwise, if a null callback was specified, remove callbacks of the given name.\n    if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n    while (++i < n) {\n      if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n      else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n    }\n\n    return this;\n  },\n  copy: function() {\n    var copy = {}, _ = this._;\n    for (var t in _) copy[t] = _[t].slice();\n    return new Dispatch(copy);\n  },\n  call: function(type, that) {\n    if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n    if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n    for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n  },\n  apply: function(type, that, args) {\n    if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n    for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n  }\n};\n\nfunction get(type, name) {\n  for (var i = 0, n = type.length, c; i < n; ++i) {\n    if ((c = type[i]).name === name) {\n      return c.value;\n    }\n  }\n}\n\nfunction set(type, name, callback) {\n  for (var i = 0, n = type.length; i < n; ++i) {\n    if (type[i].name === name) {\n      type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n      break;\n    }\n  }\n  if (callback != null) type.push({name: name, value: callback});\n  return type;\n}\n\nexport default dispatch;\n","export default function(x) {\n  return function() {\n    return x;\n  };\n}\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","export function initRange(domain, range) {\n  switch (arguments.length) {\n    case 0: break;\n    case 1: this.range(domain); break;\n    default: this.range(range).domain(domain); break;\n  }\n  return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n  switch (arguments.length) {\n    case 0: break;\n    case 1: this.interpolator(domain); break;\n    default: this.interpolator(interpolator).domain(domain); break;\n  }\n  return this;\n}\n","var array = Array.prototype;\n\nexport var map = array.map;\nexport var slice = array.slice;\n","export default function(x) {\n  return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport {map, slice} from \"./array\";\nimport constant from \"./constant\";\nimport number from \"./number\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n  return x;\n}\n\nfunction normalize(a, b) {\n  return (b -= (a = +a))\n      ? function(x) { return (x - a) / b; }\n      : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(domain) {\n  var a = domain[0], b = domain[domain.length - 1], t;\n  if (a > b) t = a, a = b, b = t;\n  return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n  var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n  if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n  else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n  return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n  var j = Math.min(domain.length, range.length) - 1,\n      d = new Array(j),\n      r = new Array(j),\n      i = -1;\n\n  // Reverse descending domains.\n  if (domain[j] < domain[0]) {\n    domain = domain.slice().reverse();\n    range = range.slice().reverse();\n  }\n\n  while (++i < j) {\n    d[i] = normalize(domain[i], domain[i + 1]);\n    r[i] = interpolate(range[i], range[i + 1]);\n  }\n\n  return function(x) {\n    var i = bisect(domain, x, 1, j) - 1;\n    return r[i](d[i](x));\n  };\n}\n\nexport function copy(source, target) {\n  return target\n      .domain(source.domain())\n      .range(source.range())\n      .interpolate(source.interpolate())\n      .clamp(source.clamp())\n      .unknown(source.unknown());\n}\n\nexport function transformer() {\n  var domain = unit,\n      range = unit,\n      interpolate = interpolateValue,\n      transform,\n      untransform,\n      unknown,\n      clamp = identity,\n      piecewise,\n      output,\n      input;\n\n  function rescale() {\n    piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;\n    output = input = null;\n    return scale;\n  }\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n  }\n\n  scale.invert = function(y) {\n    return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n  };\n\n  scale.domain = function(_) {\n    return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice();\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n  };\n\n  scale.rangeRound = function(_) {\n    return range = slice.call(_), interpolate = interpolateRound, rescale();\n  };\n\n  scale.clamp = function(_) {\n    return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity;\n  };\n\n  scale.interpolate = function(_) {\n    return arguments.length ? (interpolate = _, rescale()) : interpolate;\n  };\n\n  scale.unknown = function(_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  return function(t, u) {\n    transform = t, untransform = u;\n    return rescale();\n  };\n}\n\nexport default function continuous(transform, untransform) {\n  return transformer()(transform, untransform);\n}\n","export default function(x) {\n  return function() {\n    return x;\n  };\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport tickFormat from \"./tickFormat\";\n\nexport function linearish(scale) {\n  var domain = scale.domain;\n\n  scale.ticks = function(count) {\n    var d = domain();\n    return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n  };\n\n  scale.tickFormat = function(count, specifier) {\n    var d = domain();\n    return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n  };\n\n  scale.nice = function(count) {\n    if (count == null) count = 10;\n\n    var d = domain(),\n        i0 = 0,\n        i1 = d.length - 1,\n        start = d[i0],\n        stop = d[i1],\n        step;\n\n    if (stop < start) {\n      step = start, start = stop, stop = step;\n      step = i0, i0 = i1, i1 = step;\n    }\n\n    step = tickIncrement(start, stop, count);\n\n    if (step > 0) {\n      start = Math.floor(start / step) * step;\n      stop = Math.ceil(stop / step) * step;\n      step = tickIncrement(start, stop, count);\n    } else if (step < 0) {\n      start = Math.ceil(start * step) / step;\n      stop = Math.floor(stop * step) / step;\n      step = tickIncrement(start, stop, count);\n    }\n\n    if (step > 0) {\n      d[i0] = Math.floor(start / step) * step;\n      d[i1] = Math.ceil(stop / step) * step;\n      domain(d);\n    } else if (step < 0) {\n      d[i0] = Math.ceil(start * step) / step;\n      d[i1] = Math.floor(stop * step) / step;\n      domain(d);\n    }\n\n    return scale;\n  };\n\n  return scale;\n}\n\nexport default function linear() {\n  var scale = continuous(identity, identity);\n\n  scale.copy = function() {\n    return copy(scale, linear());\n  };\n\n  initRange.apply(scale, arguments);\n\n  return linearish(scale);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function(start, stop, count, specifier) {\n  var step = tickStep(start, stop, count),\n      precision;\n  specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n  switch (specifier.type) {\n    case \"s\": {\n      var value = Math.max(Math.abs(start), Math.abs(stop));\n      if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n      return formatPrefix(specifier, value);\n    }\n    case \"\":\n    case \"e\":\n    case \"g\":\n    case \"p\":\n    case \"r\": {\n      if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n      break;\n    }\n    case \"f\":\n    case \"%\": {\n      if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n      break;\n    }\n  }\n  return format(specifier);\n}\n","export default function(domain, interval) {\n  domain = domain.slice();\n\n  var i0 = 0,\n      i1 = domain.length - 1,\n      x0 = domain[i0],\n      x1 = domain[i1],\n      t;\n\n  if (x1 < x0) {\n    t = i0, i0 = i1, i1 = t;\n    t = x0, x0 = x1, x1 = t;\n  }\n\n  domain[i0] = interval.floor(x0);\n  domain[i1] = interval.ceil(x1);\n  return domain;\n}\n","import {linearish} from \"./linear\";\nimport {copy, identity, transformer} from \"./continuous\";\nimport {initRange} from \"./init\";\n\nfunction transformPow(exponent) {\n  return function(x) {\n    return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n  };\n}\n\nfunction transformSqrt(x) {\n  return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n  return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n  var scale = transform(identity, identity),\n      exponent = 1;\n\n  function rescale() {\n    return exponent === 1 ? transform(identity, identity)\n        : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n        : transform(transformPow(exponent), transformPow(1 / exponent));\n  }\n\n  scale.exponent = function(_) {\n    return arguments.length ? (exponent = +_, rescale()) : exponent;\n  };\n\n  return linearish(scale);\n}\n\nexport default function pow() {\n  var scale = powish(transformer());\n\n  scale.copy = function() {\n    return copy(scale, pow()).exponent(scale.exponent());\n  };\n\n  initRange.apply(scale, arguments);\n\n  return scale;\n}\n\nexport function sqrt() {\n  return pow.apply(null, arguments).exponent(0.5);\n}\n","import {ascending, bisect, quantile as threshold} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {initRange} from \"./init\";\n\nexport default function quantile() {\n  var domain = [],\n      range = [],\n      thresholds = [],\n      unknown;\n\n  function rescale() {\n    var i = 0, n = Math.max(1, range.length);\n    thresholds = new Array(n - 1);\n    while (++i < n) thresholds[i - 1] = threshold(domain, i / n);\n    return scale;\n  }\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : range[bisect(thresholds, x)];\n  }\n\n  scale.invertExtent = function(y) {\n    var i = range.indexOf(y);\n    return i < 0 ? [NaN, NaN] : [\n      i > 0 ? thresholds[i - 1] : domain[0],\n      i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n    ];\n  };\n\n  scale.domain = function(_) {\n    if (!arguments.length) return domain.slice();\n    domain = [];\n    for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);\n    domain.sort(ascending);\n    return rescale();\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (range = slice.call(_), rescale()) : range.slice();\n  };\n\n  scale.unknown = function(_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.quantiles = function() {\n    return thresholds.slice();\n  };\n\n  scale.copy = function() {\n    return quantile()\n        .domain(domain)\n        .range(range)\n        .unknown(unknown);\n  };\n\n  return initRange.apply(scale, arguments);\n}\n","import {bisect} from \"d3-array\";\nimport {slice} from \"./array\";\nimport {linearish} from \"./linear\";\nimport {initRange} from \"./init\";\n\nexport default function quantize() {\n  var x0 = 0,\n      x1 = 1,\n      n = 1,\n      domain = [0.5],\n      range = [0, 1],\n      unknown;\n\n  function scale(x) {\n    return x <= x ? range[bisect(domain, x, 0, n)] : unknown;\n  }\n\n  function rescale() {\n    var i = -1;\n    domain = new Array(n);\n    while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n    return scale;\n  }\n\n  scale.domain = function(_) {\n    return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];\n  };\n\n  scale.range = function(_) {\n    return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice();\n  };\n\n  scale.invertExtent = function(y) {\n    var i = range.indexOf(y);\n    return i < 0 ? [NaN, NaN]\n        : i < 1 ? [x0, domain[0]]\n        : i >= n ? [domain[n - 1], x1]\n        : [domain[i - 1], domain[i]];\n  };\n\n  scale.unknown = function(_) {\n    return arguments.length ? (unknown = _, scale) : scale;\n  };\n\n  scale.thresholds = function() {\n    return domain.slice();\n  };\n\n  scale.copy = function() {\n    return quantize()\n        .domain([x0, x1])\n        .range(range)\n        .unknown(unknown);\n  };\n\n  return initRange.apply(linearish(scale), arguments);\n}\n","import {bisector, tickStep} from \"d3-array\";\nimport {timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond} from \"d3-time\";\nimport {timeFormat} from \"d3-time-format\";\nimport {map} from \"./array\";\nimport continuous, {copy, identity} from \"./continuous\";\nimport {initRange} from \"./init\";\nimport nice from \"./nice\";\n\nvar durationSecond = 1000,\n    durationMinute = durationSecond * 60,\n    durationHour = durationMinute * 60,\n    durationDay = durationHour * 24,\n    durationWeek = durationDay * 7,\n    durationMonth = durationDay * 30,\n    durationYear = durationDay * 365;\n\nfunction date(t) {\n  return new Date(t);\n}\n\nfunction number(t) {\n  return t instanceof Date ? +t : +new Date(+t);\n}\n\nexport function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n  var scale = continuous(identity, identity),\n      invert = scale.invert,\n      domain = scale.domain;\n\n  var formatMillisecond = format(\".%L\"),\n      formatSecond = format(\":%S\"),\n      formatMinute = format(\"%I:%M\"),\n      formatHour = format(\"%I %p\"),\n      formatDay = format(\"%a %d\"),\n      formatWeek = format(\"%b %d\"),\n      formatMonth = format(\"%B\"),\n      formatYear = format(\"%Y\");\n\n  var tickIntervals = [\n    [second,  1,      durationSecond],\n    [second,  5,  5 * durationSecond],\n    [second, 15, 15 * durationSecond],\n    [second, 30, 30 * durationSecond],\n    [minute,  1,      durationMinute],\n    [minute,  5,  5 * durationMinute],\n    [minute, 15, 15 * durationMinute],\n    [minute, 30, 30 * durationMinute],\n    [  hour,  1,      durationHour  ],\n    [  hour,  3,  3 * durationHour  ],\n    [  hour,  6,  6 * durationHour  ],\n    [  hour, 12, 12 * durationHour  ],\n    [   day,  1,      durationDay   ],\n    [   day,  2,  2 * durationDay   ],\n    [  week,  1,      durationWeek  ],\n    [ month,  1,      durationMonth ],\n    [ month,  3,  3 * durationMonth ],\n    [  year,  1,      durationYear  ]\n  ];\n\n  function tickFormat(date) {\n    return (second(date) < date ? formatMillisecond\n        : minute(date) < date ? formatSecond\n        : hour(date) < date ? formatMinute\n        : day(date) < date ? formatHour\n        : month(date) < date ? (week(date) < date ? formatDay : formatWeek)\n        : year(date) < date ? formatMonth\n        : formatYear)(date);\n  }\n\n  function tickInterval(interval, start, stop, step) {\n    if (interval == null) interval = 10;\n\n    // If a desired tick count is specified, pick a reasonable tick interval\n    // based on the extent of the domain and a rough estimate of tick size.\n    // Otherwise, assume interval is already a time interval and use it.\n    if (typeof interval === \"number\") {\n      var target = Math.abs(stop - start) / interval,\n          i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);\n      if (i === tickIntervals.length) {\n        step = tickStep(start / durationYear, stop / durationYear, interval);\n        interval = year;\n      } else if (i) {\n        i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n        step = i[1];\n        interval = i[0];\n      } else {\n        step = Math.max(tickStep(start, stop, interval), 1);\n        interval = millisecond;\n      }\n    }\n\n    return step == null ? interval : interval.every(step);\n  }\n\n  scale.invert = function(y) {\n    return new Date(invert(y));\n  };\n\n  scale.domain = function(_) {\n    return arguments.length ? domain(map.call(_, number)) : domain().map(date);\n  };\n\n  scale.ticks = function(interval, step) {\n    var d = domain(),\n        t0 = d[0],\n        t1 = d[d.length - 1],\n        r = t1 < t0,\n        t;\n    if (r) t = t0, t0 = t1, t1 = t;\n    t = tickInterval(interval, t0, t1, step);\n    t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n    return r ? t.reverse() : t;\n  };\n\n  scale.tickFormat = function(count, specifier) {\n    return specifier == null ? tickFormat : format(specifier);\n  };\n\n  scale.nice = function(interval, step) {\n    var d = domain();\n    return (interval = tickInterval(interval, d[0], d[d.length - 1], step))\n        ? domain(nice(d, interval))\n        : scale;\n  };\n\n  scale.copy = function() {\n    return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n  };\n\n  return scale;\n}\n\nexport default function() {\n  return initRange.apply(calendar(timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n"],"sourceRoot":""}