From 5ed41d93b59ff68a9386e431d12246cb1a33b944 Mon Sep 17 00:00:00 2001 From: Eduardo Gurgel Date: Thu, 21 Sep 2017 22:59:29 +1200 Subject: [PATCH 1/3] Update static/js/app.js --- priv/static/js/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/priv/static/js/app.js b/priv/static/js/app.js index 811c3c3..686310f 100644 --- a/priv/static/js/app.js +++ b/priv/static/js/app.js @@ -15490,8 +15490,8 @@ var QueuesIndex = function () { exports.default = QueuesIndex; }); -;require.alias("phoenix/priv/static/phoenix.js", "phoenix"); -require.alias("phoenix_html/priv/static/phoenix_html.js", "phoenix_html"); +;require.alias("phoenix_html/priv/static/phoenix_html.js", "phoenix_html"); +require.alias("phoenix/priv/static/phoenix.js", "phoenix"); require.alias("rickshaw/rickshaw.js", "rickshaw"); require.alias("d3/d3.js", "d3");require.register("___globals___", function(exports, require, module) { From 6abf7d8dd575d8105f513ac307ee6ea7e8a5d68e Mon Sep 17 00:00:00 2001 From: Eduardo Gurgel Date: Sun, 24 Sep 2017 17:33:26 +1300 Subject: [PATCH 2/3] Change main.js to check before calling init to view --- priv/static/js/app.js | 5 ++++- priv/static/js/app.js.map | 2 +- web/static/js/main.js | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/priv/static/js/app.js b/priv/static/js/app.js index 686310f..3c02cb0 100644 --- a/priv/static/js/app.js +++ b/priv/static/js/app.js @@ -15342,8 +15342,11 @@ var views = { function handleDOMContentLoaded() { var viewName = document.getElementsByTagName('body')[0].dataset.jsViewPath; + var view = views[viewName]; - views[viewName].init(); + if (view) { + view.init(); + } } window.addEventListener('DOMContentLoaded', handleDOMContentLoaded, false); diff --git a/priv/static/js/app.js.map b/priv/static/js/app.js.map index bbb6b6f..28aaa9e 100644 --- a/priv/static/js/app.js.map +++ b/priv/static/js/app.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/d3/d3.js","node_modules/phoenix/priv/static/phoenix.js","node_modules/phoenix_html/priv/static/phoenix_html.js","node_modules/rickshaw/rickshaw.js","web/static/js/app.js","web/static/js/main.js","web/static/js/page_index.js","web/static/js/queues_index.js","bower_components/jquery/dist/jquery.js","bower_components/bootstrap/dist/js/bootstrap.js"],"names":["views","PageIndex","QueuesIndex","handleDOMContentLoaded","viewName","document","getElementsByTagName","dataset","jsViewPath","init","window","addEventListener","graph","Graph","element","querySelector","renderer","stroke","series","Series","FixedDuration","name","color","undefined","timeInterval","maxDataPoints","timeBase","Date","getTime","hoverDetail","HoverDetail","xFormatter","x","toString","yFormatter","parseInt","y","socket","MOUNT_PATH","connect","chan","channel","join","on","addData","msg","render","$","each","n","el","form","post","attr","serialize","queue","status","button","parent","row","size","removeClass","addClass","html","removeAttr","global","factory","module","exports","w","Error","noGlobal","arr","slice","concat","push","indexOf","class2type","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","callback","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","options","src","copy","copyIsArray","clone","target","deep","isFunction","isPlainObject","isArray","expando","Math","random","replace","isReady","error","noop","obj","type","Array","isWindow","isNumeric","realStringObj","parseFloat","key","nodeType","isEmptyObject","globalEval","code","script","indirect","eval","trim","createElement","text","head","appendChild","parentNode","removeChild","camelCase","string","nodeName","toLowerCase","isArrayLike","makeArray","results","Object","inArray","second","grep","invert","callbackInverse","matches","callbackExpect","arg","value","guid","proxy","tmp","args","now","Symbol","iterator","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","pop","push_native","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","childNodes","e","els","seed","m","nid","nidselect","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","querySelectorAll","qsaError","removeAttribute","keys","cache","cacheLength","shift","markFunction","assert","div","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","doc","defaultView","top","attachEvent","className","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative","dir","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","useCache","lastChild","uniqueID","pseudo","setFilters","idx","matched","matcher","unmatched","innerText","lang","elemLang","hash","location","activeElement","hasFocus","href","tabIndex","disabled","checked","selected","selectedIndex","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","div1","defaultValue","unique","isXMLDoc","until","truncate","is","siblings","rneedsContext","needsContext","rsingleTag","risSimple","winnow","qualifier","not","self","rootjQuery","root","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","has","targets","l","closest","pos","index","prevAll","add","addBack","sibling","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","reverse","rnotwhite","createOptions","object","flag","Callbacks","firing","memory","fired","locked","firingIndex","fire","once","stopOnFalse","remove","empty","disable","lock","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","progress","notify","resolve","reject","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","triggerHandler","off","completed","removeEventListener","readyState","doScroll","setTimeout","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","uid","register","initial","defineProperty","writable","configurable","set","data","prop","stored","camel","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","parseJSON","removeData","_data","_removeData","camelKey","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isHidden","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","unit","cssNumber","initialInUnit","style","rcheckableType","rtagName","rscriptType","wrapMap","option","thead","col","tr","td","_default","optgroup","tbody","tfoot","colgroup","caption","th","getAll","setGlobalEval","refElements","rhtml","buildFragment","scripts","selection","ignored","wrap","fragment","createDocumentFragment","nodes","createTextNode","htmlPrefilter","checkClone","cloneNode","noCloneChecked","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","types","one","origFn","event","handleObjIn","eventHandle","events","t","handleObj","special","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","fix","handlerQueue","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","preventDefault","stopPropagation","postDispatch","sel","isNaN","props","fixHooks","keyHooks","original","which","charCode","keyCode","mouseHooks","eventDoc","body","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","originalEvent","fixHook","Event","load","noBubble","focus","trigger","blur","click","beforeunload","returnValue","isDefaultPrevented","defaultPrevented","timeStamp","isSimulated","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","relatedTarget","rxhtmlTag","rnoInnerhtml","rchecked","rscriptTypeMasked","rcleanScript","manipulationTarget","content","disableScript","restoreScript","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","fixInput","domManip","collection","hasScripts","iNoClone","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","HTML","BODY","actualDisplay","display","defaultDisplay","write","close","rmargin","rnumnonpx","getStyles","view","opener","getComputedStyle","swap","old","pixelPositionVal","boxSizingReliableVal","pixelMarginRightVal","reliableMarginLeftVal","container","backgroundClip","clearCloneStyle","cssText","computeStyleTests","divStyle","marginLeft","width","marginRight","pixelPosition","boxSizingReliable","pixelMarginRight","reliableMarginLeft","reliableMarginRight","marginDiv","curCSS","computed","minWidth","maxWidth","getPropertyValue","addGetHookIf","conditionFn","hookFn","rdisplayswap","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","emptyStyle","vendorPropName","capName","setPositiveNumber","subtract","max","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","offsetWidth","offsetHeight","showHide","show","hidden","cssHooks","opacity","cssProps","origName","isFinite","getBoundingClientRect","left","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","propHooks","run","percent","eased","duration","step","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rrun","createFxNow","genFx","includeWidth","height","createTween","animation","Animation","tweeners","defaultPrefilter","opts","oldfire","checkDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","properties","stopped","prefilters","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","optDisabled","radioValue","boolHook","nType","attrHooks","bool","propName","attrNames","propFix","getter","rfocusable","rclickable","removeProp","tabindex","rclass","getClass","classes","curValue","clazz","finalValue","toggleClass","stateVal","classNames","hasClass","rreturn","rspaces","valHooks","optionSet","rfocusMorph","onlyHandlers","bubbleType","ontype","eventPath","isTrigger","parentWindow","simulate","hover","fnOver","fnOut","focusin","attaches","nonce","rquery","JSON","parse","parseXML","DOMParser","parseFromString","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","ct","finalDataType","firstDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","throws","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","abort","statusText","finalText","success","method","crossDomain","host","param","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","wrapAll","firstElementChild","wrapInner","unwrap","visible","getClientRects","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serializeArray","xhr","XMLHttpRequest","xhrSuccessStatus","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","onreadystatechange","responseType","responseText","binary","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","bind","unbind","delegate","undelegate","andSelf","define","amd","_jQuery","_$","noConflict","transitionEnd","transEndEventNames","WebkitTransition","MozTransition","OTransition","transition","emulateTransitionEnd","called","$el","bsTransitionEnd","dismiss","Alert","VERSION","TRANSITION_DURATION","$this","$parent","removeElement","Plugin","alert","Constructor","Button","$element","DEFAULTS","isLoading","loadingText","setState","d","resetText","changed","$input","$btn","Carousel","$indicators","paused","sliding","$active","$items","keyboard","keydown","pause","cycle","tagName","getItemIndex","item","getItemForDirection","direction","activeIndex","willWrap","delta","itemIndex","that","slide","$next","isCycling","slideEvent","$nextIndicator","slidEvent","action","carousel","clickHandler","$target","slideIndex","$carousel","Collapse","$trigger","transitioning","getParent","addAriaAndCollapsedClass","dimension","hasWidth","activesData","actives","startEvent","scrollSize","getTargetFromTrigger","isOpen","collapse","backdrop","Dropdown","clearMenus","isActive","desc","dropdown","Modal","$body","$dialog","$backdrop","isShown","originalBodyPad","scrollbarWidth","ignoreBackdropClick","remote","BACKDROP_TRANSITION_DURATION","_relatedTarget","checkScrollbar","setScrollbar","escape","resize","adjustDialog","enforceFocus","hideModal","handleUpdate","resetAdjustments","resetScrollbar","removeBackdrop","doAnimate","callbackRemove","modalIsOverflowing","scrollHeight","clientHeight","paddingLeft","bodyIsOverflowing","paddingRight","fullWindowWidth","innerWidth","documentElementRect","right","abs","clientWidth","measureScrollbar","bodyPad","scrollDiv","modal","showEvent","Tooltip","enabled","hoverState","inState","placement","template","title","viewport","getOptions","$viewport","triggers","eventIn","eventOut","enter","leave","_options","fixTitle","getDefaults","getDelegateOptions","defaults","tip","isInStateTrue","inDom","$tip","tipId","getUID","setContent","autoToken","autoPlace","getPosition","actualWidth","actualHeight","orgPlacement","viewportDim","bottom","calculatedOffset","getCalculatedOffset","applyPlacement","prevHoverState","marginTop","round","getViewportAdjustedDelta","isVertical","arrowDelta","arrowOffsetPosition","replaceArrow","arrow","getTitle","$e","isBody","elRect","elOffset","scroll","outerDims","viewportPadding","viewportDimensions","topEdgeOffset","bottomEdgeOffset","leftEdgeOffset","rightEdgeOffset","o","$arrow","enable","toggleEnabled","destroy","tooltip","Popover","getContent","popover","ScrollSpy","$scrollElement","offsets","activeTarget","process","refresh","getScrollHeight","offsetMethod","offsetBase","$href","maxScroll","activate","clear","scrollspy","$spy","Tab","$ul","$previous","hideEvent","tab","Affix","checkPosition","checkPositionWithEventLoop","affixed","unpin","pinnedOffset","RESET","getState","offsetTop","offsetBottom","targetHeight","initializing","colliderTop","colliderHeight","getPinnedOffset","affix","affixType"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACv1SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3vCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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","file":"priv/static/js/app.js","sourcesContent":["\nrequire.register(\"d3/d3.js\", function(exports, require, module) {\n require = __makeRelativeRequire(require, {}, \"d3\");\n (function() {\n !function() {\n var d3 = {\n version: \"3.5.17\"\n };\n var d3_arraySlice = [].slice, d3_array = function(list) {\n return d3_arraySlice.call(list);\n };\n var d3_document = this.document;\n function d3_documentElement(node) {\n return node && (node.ownerDocument || node.document || node).documentElement;\n }\n function d3_window(node) {\n return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n }\n if (d3_document) {\n try {\n d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n } catch (e) {\n d3_array = function(list) {\n var i = list.length, array = new Array(i);\n while (i--) array[i] = list[i];\n return array;\n };\n }\n }\n if (!Date.now) Date.now = function() {\n return +new Date();\n };\n if (d3_document) {\n try {\n d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n } catch (error) {\n var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n d3_element_prototype.setAttribute = function(name, value) {\n d3_element_setAttribute.call(this, name, value + \"\");\n };\n d3_element_prototype.setAttributeNS = function(space, local, value) {\n d3_element_setAttributeNS.call(this, space, local, value + \"\");\n };\n d3_style_prototype.setProperty = function(name, value, priority) {\n d3_style_setProperty.call(this, name, value + \"\", priority);\n };\n }\n }\n d3.ascending = d3_ascending;\n function d3_ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n }\n d3.descending = function(a, b) {\n return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n };\n d3.min = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n }\n return a;\n };\n d3.max = function(array, f) {\n var i = -1, n = array.length, a, b;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n }\n return a;\n };\n d3.extent = function(array, f) {\n var i = -1, n = array.length, a, b, c;\n if (arguments.length === 1) {\n while (++i < n) if ((b = array[i]) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = array[i]) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n } else {\n while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n a = c = b;\n break;\n }\n while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n if (a > b) a = b;\n if (c < b) c = b;\n }\n }\n return [ a, c ];\n };\n function d3_number(x) {\n return x === null ? NaN : +x;\n }\n function d3_numeric(x) {\n return !isNaN(x);\n }\n d3.sum = function(array, f) {\n var s = 0, n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n } else {\n while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n }\n return s;\n };\n d3.mean = function(array, f) {\n var s = 0, n = array.length, a, i = -1, j = n;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n }\n if (j) return s / j;\n };\n d3.quantile = function(values, p) {\n var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n return e ? v + e * (values[h] - v) : v;\n };\n d3.median = function(array, f) {\n var numbers = [], n = array.length, a, i = -1;\n if (arguments.length === 1) {\n while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n } else {\n while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n }\n if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n };\n d3.variance = function(array, f) {\n var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n if (arguments.length === 1) {\n while (++i < n) {\n if (d3_numeric(a = d3_number(array[i]))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n } else {\n while (++i < n) {\n if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n d = a - m;\n m += d / ++j;\n s += d * (a - m);\n }\n }\n }\n if (j > 1) return s / (j - 1);\n };\n d3.deviation = function() {\n var v = d3.variance.apply(this, arguments);\n return v ? Math.sqrt(v) : v;\n };\n function d3_bisector(compare) {\n return {\n left: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (arguments.length < 3) lo = 0;\n if (arguments.length < 4) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n }\n return lo;\n }\n };\n }\n var d3_bisect = d3_bisector(d3_ascending);\n d3.bisectLeft = d3_bisect.left;\n d3.bisect = d3.bisectRight = d3_bisect.right;\n d3.bisector = function(f) {\n return d3_bisector(f.length === 1 ? function(d, x) {\n return d3_ascending(f(d), x);\n } : f);\n };\n d3.shuffle = function(array, i0, i1) {\n if ((m = arguments.length) < 3) {\n i1 = array.length;\n if (m < 2) i0 = 0;\n }\n var m = i1 - i0, t, i;\n while (m) {\n i = Math.random() * m-- | 0;\n t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n }\n return array;\n };\n d3.permute = function(array, indexes) {\n var i = indexes.length, permutes = new Array(i);\n while (i--) permutes[i] = array[indexes[i]];\n return permutes;\n };\n d3.pairs = function(array) {\n var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n return pairs;\n };\n d3.transpose = function(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n };\n function d3_transposeLength(d) {\n return d.length;\n }\n d3.zip = function() {\n return d3.transpose(arguments);\n };\n d3.keys = function(map) {\n var keys = [];\n for (var key in map) keys.push(key);\n return keys;\n };\n d3.values = function(map) {\n var values = [];\n for (var key in map) values.push(map[key]);\n return values;\n };\n d3.entries = function(map) {\n var entries = [];\n for (var key in map) entries.push({\n key: key,\n value: map[key]\n });\n return entries;\n };\n d3.merge = function(arrays) {\n var n = arrays.length, m, i = -1, j = 0, merged, array;\n while (++i < n) j += arrays[i].length;\n merged = new Array(j);\n while (--n >= 0) {\n array = arrays[n];\n m = array.length;\n while (--m >= 0) {\n merged[--j] = array[m];\n }\n }\n return merged;\n };\n var abs = Math.abs;\n d3.range = function(start, stop, step) {\n if (arguments.length < 3) {\n step = 1;\n if (arguments.length < 2) {\n stop = start;\n start = 0;\n }\n }\n if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n start *= k, stop *= k, step *= k;\n if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n return range;\n };\n function d3_range_integerScale(x) {\n var k = 1;\n while (x * k % 1) k *= 10;\n return k;\n }\n function d3_class(ctor, properties) {\n for (var key in properties) {\n Object.defineProperty(ctor.prototype, key, {\n value: properties[key],\n enumerable: false\n });\n }\n }\n d3.map = function(object, f) {\n var map = new d3_Map();\n if (object instanceof d3_Map) {\n object.forEach(function(key, value) {\n map.set(key, value);\n });\n } else if (Array.isArray(object)) {\n var i = -1, n = object.length, o;\n if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n } else {\n for (var key in object) map.set(key, object[key]);\n }\n return map;\n };\n function d3_Map() {\n this._ = Object.create(null);\n }\n var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n d3_class(d3_Map, {\n has: d3_map_has,\n get: function(key) {\n return this._[d3_map_escape(key)];\n },\n set: function(key, value) {\n return this._[d3_map_escape(key)] = value;\n },\n remove: d3_map_remove,\n keys: d3_map_keys,\n values: function() {\n var values = [];\n for (var key in this._) values.push(this._[key]);\n return values;\n },\n entries: function() {\n var entries = [];\n for (var key in this._) entries.push({\n key: d3_map_unescape(key),\n value: this._[key]\n });\n return entries;\n },\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n }\n });\n function d3_map_escape(key) {\n return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n }\n function d3_map_unescape(key) {\n return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n }\n function d3_map_has(key) {\n return d3_map_escape(key) in this._;\n }\n function d3_map_remove(key) {\n return (key = d3_map_escape(key)) in this._ && delete this._[key];\n }\n function d3_map_keys() {\n var keys = [];\n for (var key in this._) keys.push(d3_map_unescape(key));\n return keys;\n }\n function d3_map_size() {\n var size = 0;\n for (var key in this._) ++size;\n return size;\n }\n function d3_map_empty() {\n for (var key in this._) return false;\n return true;\n }\n d3.nest = function() {\n var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n function map(mapType, array, depth) {\n if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n while (++i < n) {\n if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n values.push(object);\n } else {\n valuesByKey.set(keyValue, [ object ]);\n }\n }\n if (mapType) {\n object = mapType();\n setter = function(keyValue, values) {\n object.set(keyValue, map(mapType, values, depth));\n };\n } else {\n object = {};\n setter = function(keyValue, values) {\n object[keyValue] = map(mapType, values, depth);\n };\n }\n valuesByKey.forEach(setter);\n return object;\n }\n function entries(map, depth) {\n if (depth >= keys.length) return map;\n var array = [], sortKey = sortKeys[depth++];\n map.forEach(function(key, keyMap) {\n array.push({\n key: key,\n values: entries(keyMap, depth)\n });\n });\n return sortKey ? array.sort(function(a, b) {\n return sortKey(a.key, b.key);\n }) : array;\n }\n nest.map = function(array, mapType) {\n return map(mapType, array, 0);\n };\n nest.entries = function(array) {\n return entries(map(d3.map, array, 0), 0);\n };\n nest.key = function(d) {\n keys.push(d);\n return nest;\n };\n nest.sortKeys = function(order) {\n sortKeys[keys.length - 1] = order;\n return nest;\n };\n nest.sortValues = function(order) {\n sortValues = order;\n return nest;\n };\n nest.rollup = function(f) {\n rollup = f;\n return nest;\n };\n return nest;\n };\n d3.set = function(array) {\n var set = new d3_Set();\n if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n return set;\n };\n function d3_Set() {\n this._ = Object.create(null);\n }\n d3_class(d3_Set, {\n has: d3_map_has,\n add: function(key) {\n this._[d3_map_escape(key += \"\")] = true;\n return key;\n },\n remove: d3_map_remove,\n values: d3_map_keys,\n size: d3_map_size,\n empty: d3_map_empty,\n forEach: function(f) {\n for (var key in this._) f.call(this, d3_map_unescape(key));\n }\n });\n d3.behavior = {};\n function d3_identity(d) {\n return d;\n }\n d3.rebind = function(target, source) {\n var i = 1, n = arguments.length, method;\n while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n return target;\n };\n function d3_rebind(target, source, method) {\n return function() {\n var value = method.apply(source, arguments);\n return value === source ? target : value;\n };\n }\n function d3_vendorSymbol(object, name) {\n if (name in object) return name;\n name = name.charAt(0).toUpperCase() + name.slice(1);\n for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n var prefixName = d3_vendorPrefixes[i] + name;\n if (prefixName in object) return prefixName;\n }\n }\n var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n function d3_noop() {}\n d3.dispatch = function() {\n var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n return dispatch;\n };\n function d3_dispatch() {}\n d3_dispatch.prototype.on = function(type, listener) {\n var i = type.indexOf(\".\"), name = \"\";\n if (i >= 0) {\n name = type.slice(i + 1);\n type = type.slice(0, i);\n }\n if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n if (arguments.length === 2) {\n if (listener == null) for (type in this) {\n if (this.hasOwnProperty(type)) this[type].on(name, null);\n }\n return this;\n }\n };\n function d3_dispatch_event(dispatch) {\n var listeners = [], listenerByName = new d3_Map();\n function event() {\n var z = listeners, i = -1, n = z.length, l;\n while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n return dispatch;\n }\n event.on = function(name, listener) {\n var l = listenerByName.get(name), i;\n if (arguments.length < 2) return l && l.on;\n if (l) {\n l.on = null;\n listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n listenerByName.remove(name);\n }\n if (listener) listeners.push(listenerByName.set(name, {\n on: listener\n }));\n return dispatch;\n };\n return event;\n }\n d3.event = null;\n function d3_eventPreventDefault() {\n d3.event.preventDefault();\n }\n function d3_eventSource() {\n var e = d3.event, s;\n while (s = e.sourceEvent) e = s;\n return e;\n }\n function d3_eventDispatch(target) {\n var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n dispatch.of = function(thiz, argumentz) {\n return function(e1) {\n try {\n var e0 = e1.sourceEvent = d3.event;\n e1.target = target;\n d3.event = e1;\n dispatch[e1.type].apply(thiz, argumentz);\n } finally {\n d3.event = e0;\n }\n };\n };\n return dispatch;\n }\n d3.requote = function(s) {\n return s.replace(d3_requote_re, \"\\\\$&\");\n };\n var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n var d3_subclass = {}.__proto__ ? function(object, prototype) {\n object.__proto__ = prototype;\n } : function(object, prototype) {\n for (var property in prototype) object[property] = prototype[property];\n };\n function d3_selection(groups) {\n d3_subclass(groups, d3_selectionPrototype);\n return groups;\n }\n var d3_select = function(s, n) {\n return n.querySelector(s);\n }, d3_selectAll = function(s, n) {\n return n.querySelectorAll(s);\n }, d3_selectMatches = function(n, s) {\n var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n d3_selectMatches = function(n, s) {\n return d3_selectMatcher.call(n, s);\n };\n return d3_selectMatches(n, s);\n };\n if (typeof Sizzle === \"function\") {\n d3_select = function(s, n) {\n return Sizzle(s, n)[0] || null;\n };\n d3_selectAll = Sizzle;\n d3_selectMatches = Sizzle.matchesSelector;\n }\n d3.selection = function() {\n return d3.select(d3_document.documentElement);\n };\n var d3_selectionPrototype = d3.selection.prototype = [];\n d3_selectionPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, group, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selector(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_select(selector, this);\n };\n }\n d3_selectionPrototype.selectAll = function(selector) {\n var subgroups = [], subgroup, node;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n subgroup.parentNode = node;\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_selectorAll(selector) {\n return typeof selector === \"function\" ? selector : function() {\n return d3_selectAll(selector, this);\n };\n }\n var d3_nsXhtml = \"http://www.w3.org/1999/xhtml\";\n var d3_nsPrefix = {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: d3_nsXhtml,\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 d3.ns = {\n prefix: d3_nsPrefix,\n qualify: function(name) {\n var i = name.indexOf(\":\"), prefix = name;\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return d3_nsPrefix.hasOwnProperty(prefix) ? {\n space: d3_nsPrefix[prefix],\n local: name\n } : name;\n }\n };\n d3_selectionPrototype.attr = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node();\n name = d3.ns.qualify(name);\n return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n }\n for (value in name) this.each(d3_selection_attr(value, name[value]));\n return this;\n }\n return this.each(d3_selection_attr(name, value));\n };\n function d3_selection_attr(name, value) {\n name = d3.ns.qualify(name);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrConstant() {\n this.setAttribute(name, value);\n }\n function attrConstantNS() {\n this.setAttributeNS(name.space, name.local, value);\n }\n function attrFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n }\n function attrFunctionNS() {\n var x = value.apply(this, arguments);\n if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n }\n return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n }\n function d3_collapse(s) {\n return s.trim().replace(/\\s+/g, \" \");\n }\n d3_selectionPrototype.classed = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") {\n var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n if (value = node.classList) {\n while (++i < n) if (!value.contains(name[i])) return false;\n } else {\n value = node.getAttribute(\"class\");\n while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n }\n return true;\n }\n for (value in name) this.each(d3_selection_classed(value, name[value]));\n return this;\n }\n return this.each(d3_selection_classed(name, value));\n };\n function d3_selection_classedRe(name) {\n return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n }\n function d3_selection_classes(name) {\n return (name + \"\").trim().split(/^|\\s+/);\n }\n function d3_selection_classed(name, value) {\n name = d3_selection_classes(name).map(d3_selection_classedName);\n var n = name.length;\n function classedConstant() {\n var i = -1;\n while (++i < n) name[i](this, value);\n }\n function classedFunction() {\n var i = -1, x = value.apply(this, arguments);\n while (++i < n) name[i](this, x);\n }\n return typeof value === \"function\" ? classedFunction : classedConstant;\n }\n function d3_selection_classedName(name) {\n var re = d3_selection_classedRe(name);\n return function(node, value) {\n if (c = node.classList) return value ? c.add(name) : c.remove(name);\n var c = node.getAttribute(\"class\") || \"\";\n if (value) {\n re.lastIndex = 0;\n if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n } else {\n node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n }\n };\n }\n d3_selectionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n return this;\n }\n if (n < 2) {\n var node = this.node();\n return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n }\n priority = \"\";\n }\n return this.each(d3_selection_style(name, value, priority));\n };\n function d3_selection_style(name, value, priority) {\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleConstant() {\n this.style.setProperty(name, value, priority);\n }\n function styleFunction() {\n var x = value.apply(this, arguments);\n if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n }\n return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n }\n d3_selectionPrototype.property = function(name, value) {\n if (arguments.length < 2) {\n if (typeof name === \"string\") return this.node()[name];\n for (value in name) this.each(d3_selection_property(value, name[value]));\n return this;\n }\n return this.each(d3_selection_property(name, value));\n };\n function d3_selection_property(name, value) {\n function propertyNull() {\n delete this[name];\n }\n function propertyConstant() {\n this[name] = value;\n }\n function propertyFunction() {\n var x = value.apply(this, arguments);\n if (x == null) delete this[name]; else this[name] = x;\n }\n return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n }\n d3_selectionPrototype.text = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n } : value == null ? function() {\n this.textContent = \"\";\n } : function() {\n this.textContent = value;\n }) : this.node().textContent;\n };\n d3_selectionPrototype.html = function(value) {\n return arguments.length ? this.each(typeof value === \"function\" ? function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n } : value == null ? function() {\n this.innerHTML = \"\";\n } : function() {\n this.innerHTML = value;\n }) : this.node().innerHTML;\n };\n d3_selectionPrototype.append = function(name) {\n name = d3_selection_creator(name);\n return this.select(function() {\n return this.appendChild(name.apply(this, arguments));\n });\n };\n function d3_selection_creator(name) {\n function create() {\n var document = this.ownerDocument, namespace = this.namespaceURI;\n return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);\n }\n function createNS() {\n return this.ownerDocument.createElementNS(name.space, name.local);\n }\n return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n }\n d3_selectionPrototype.insert = function(name, before) {\n name = d3_selection_creator(name);\n before = d3_selection_selector(before);\n return this.select(function() {\n return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n });\n };\n d3_selectionPrototype.remove = function() {\n return this.each(d3_selectionRemove);\n };\n function d3_selectionRemove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n }\n d3_selectionPrototype.data = function(value, key) {\n var i = -1, n = this.length, group, node;\n if (!arguments.length) {\n value = new Array(n = (group = this[0]).length);\n while (++i < n) {\n if (node = group[i]) {\n value[i] = node.__data__;\n }\n }\n return value;\n }\n function bind(group, groupData) {\n var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n if (key) {\n var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n for (i = -1; ++i < n; ) {\n if (node = group[i]) {\n if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n exitNodes[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n keyValues[i] = keyValue;\n }\n }\n for (i = -1; ++i < m; ) {\n if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n } else if (node !== true) {\n updateNodes[i] = node;\n node.__data__ = nodeData;\n }\n nodeByKeyValue.set(keyValue, true);\n }\n for (i = -1; ++i < n; ) {\n if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n exitNodes[i] = group[i];\n }\n }\n } else {\n for (i = -1; ++i < n0; ) {\n node = group[i];\n nodeData = groupData[i];\n if (node) {\n node.__data__ = nodeData;\n updateNodes[i] = node;\n } else {\n enterNodes[i] = d3_selection_dataNode(nodeData);\n }\n }\n for (;i < m; ++i) {\n enterNodes[i] = d3_selection_dataNode(groupData[i]);\n }\n for (;i < n; ++i) {\n exitNodes[i] = group[i];\n }\n }\n enterNodes.update = updateNodes;\n enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n enter.push(enterNodes);\n update.push(updateNodes);\n exit.push(exitNodes);\n }\n var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n if (typeof value === \"function\") {\n while (++i < n) {\n bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n }\n } else {\n while (++i < n) {\n bind(group = this[i], value);\n }\n }\n update.enter = function() {\n return enter;\n };\n update.exit = function() {\n return exit;\n };\n return update;\n };\n function d3_selection_dataNode(data) {\n return {\n __data__: data\n };\n }\n d3_selectionPrototype.datum = function(value) {\n return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n };\n d3_selectionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n subgroup.parentNode = (group = this[j]).parentNode;\n for (var i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_selection(subgroups);\n };\n function d3_selection_filter(selector) {\n return function() {\n return d3_selectMatches(this, selector);\n };\n }\n d3_selectionPrototype.order = function() {\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n if (node = group[i]) {\n if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n return this;\n };\n d3_selectionPrototype.sort = function(comparator) {\n comparator = d3_selection_sortComparator.apply(this, arguments);\n for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n return this.order();\n };\n function d3_selection_sortComparator(comparator) {\n if (!arguments.length) comparator = d3_ascending;\n return function(a, b) {\n return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n };\n }\n d3_selectionPrototype.each = function(callback) {\n return d3_selection_each(this, function(node, i, j) {\n callback.call(node, node.__data__, i, j);\n });\n };\n function d3_selection_each(groups, callback) {\n for (var 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(node, i, j);\n }\n }\n return groups;\n }\n d3_selectionPrototype.call = function(callback) {\n var args = d3_array(arguments);\n callback.apply(args[0] = this, args);\n return this;\n };\n d3_selectionPrototype.empty = function() {\n return !this.node();\n };\n d3_selectionPrototype.node = function() {\n for (var j = 0, m = this.length; j < m; j++) {\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n var node = group[i];\n if (node) return node;\n }\n }\n return null;\n };\n d3_selectionPrototype.size = function() {\n var n = 0;\n d3_selection_each(this, function() {\n ++n;\n });\n return n;\n };\n function d3_selection_enter(selection) {\n d3_subclass(selection, d3_selection_enterPrototype);\n return selection;\n }\n var d3_selection_enterPrototype = [];\n d3.selection.enter = d3_selection_enter;\n d3.selection.enter.prototype = d3_selection_enterPrototype;\n d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n d3_selection_enterPrototype.select = function(selector) {\n var subgroups = [], subgroup, subnode, upgroup, group, node;\n for (var j = -1, m = this.length; ++j < m; ) {\n upgroup = (group = this[j]).update;\n subgroups.push(subgroup = []);\n subgroup.parentNode = group.parentNode;\n for (var i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n subnode.__data__ = node.__data__;\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_selection(subgroups);\n };\n d3_selection_enterPrototype.insert = function(name, before) {\n if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n return d3_selectionPrototype.insert.call(this, name, before);\n };\n function d3_selection_enterInsertBefore(enter) {\n var i0, j0;\n return function(d, i, j) {\n var group = enter[j].update, n = group.length, node;\n if (j != j0) j0 = j, i0 = 0;\n if (i >= i0) i0 = i + 1;\n while (!(node = group[i0]) && ++i0 < n) ;\n return node;\n };\n }\n d3.select = function(node) {\n var group;\n if (typeof node === \"string\") {\n group = [ d3_select(node, d3_document) ];\n group.parentNode = d3_document.documentElement;\n } else {\n group = [ node ];\n group.parentNode = d3_documentElement(node);\n }\n return d3_selection([ group ]);\n };\n d3.selectAll = function(nodes) {\n var group;\n if (typeof nodes === \"string\") {\n group = d3_array(d3_selectAll(nodes, d3_document));\n group.parentNode = d3_document.documentElement;\n } else {\n group = d3_array(nodes);\n group.parentNode = null;\n }\n return d3_selection([ group ]);\n };\n d3_selectionPrototype.on = function(type, listener, capture) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof type !== \"string\") {\n if (n < 2) listener = false;\n for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n return this;\n }\n if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n capture = false;\n }\n return this.each(d3_selection_on(type, listener, capture));\n };\n function d3_selection_on(type, listener, capture) {\n var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n if (i > 0) type = type.slice(0, i);\n var filter = d3_selection_onFilters.get(type);\n if (filter) type = filter, wrap = d3_selection_onFilter;\n function onRemove() {\n var l = this[name];\n if (l) {\n this.removeEventListener(type, l, l.$);\n delete this[name];\n }\n }\n function onAdd() {\n var l = wrap(listener, d3_array(arguments));\n onRemove.call(this);\n this.addEventListener(type, this[name] = l, l.$ = capture);\n l._ = listener;\n }\n function removeAll() {\n var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n for (var name in this) {\n if (match = name.match(re)) {\n var l = this[name];\n this.removeEventListener(match[1], l, l.$);\n delete this[name];\n }\n }\n }\n return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n }\n var d3_selection_onFilters = d3.map({\n mouseenter: \"mouseover\",\n mouseleave: \"mouseout\"\n });\n if (d3_document) {\n d3_selection_onFilters.forEach(function(k) {\n if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n });\n }\n function d3_selection_onListener(listener, argumentz) {\n return function(e) {\n var o = d3.event;\n d3.event = e;\n argumentz[0] = this.__data__;\n try {\n listener.apply(this, argumentz);\n } finally {\n d3.event = o;\n }\n };\n }\n function d3_selection_onFilter(listener, argumentz) {\n var l = d3_selection_onListener(listener, argumentz);\n return function(e) {\n var target = this, related = e.relatedTarget;\n if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n l.call(target, e);\n }\n };\n }\n var d3_event_dragSelect, d3_event_dragId = 0;\n function d3_event_dragSuppress(node) {\n var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n if (d3_event_dragSelect == null) {\n d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n }\n if (d3_event_dragSelect) {\n var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n style[d3_event_dragSelect] = \"none\";\n }\n return function(suppressClick) {\n w.on(name, null);\n if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n if (suppressClick) {\n var off = function() {\n w.on(click, null);\n };\n w.on(click, function() {\n d3_eventPreventDefault();\n off();\n }, true);\n setTimeout(off, 0);\n }\n };\n }\n d3.mouse = function(container) {\n return d3_mousePoint(container, d3_eventSource());\n };\n var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n function d3_mousePoint(container, e) {\n if (e.changedTouches) e = e.changedTouches[0];\n var svg = container.ownerSVGElement || container;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n if (d3_mouse_bug44083 < 0) {\n var window = d3_window(container);\n if (window.scrollX || window.scrollY) {\n svg = d3.select(\"body\").append(\"svg\").style({\n position: \"absolute\",\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n border: \"none\"\n }, \"important\");\n var ctm = svg[0][0].getScreenCTM();\n d3_mouse_bug44083 = !(ctm.f || ctm.e);\n svg.remove();\n }\n }\n if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n point.y = e.clientY;\n point = point.matrixTransform(container.getScreenCTM().inverse());\n return [ point.x, point.y ];\n }\n var rect = container.getBoundingClientRect();\n return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n }\n d3.touch = function(container, touches, identifier) {\n if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n if ((touch = touches[i]).identifier === identifier) {\n return d3_mousePoint(container, touch);\n }\n }\n };\n d3.behavior.drag = function() {\n var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n function drag() {\n this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n }\n function dragstart(id, position, subject, move, end) {\n return function() {\n var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n if (origin) {\n dragOffset = origin.apply(that, arguments);\n dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n } else {\n dragOffset = [ 0, 0 ];\n }\n dispatch({\n type: \"dragstart\"\n });\n function moved() {\n var position1 = position(parent, dragId), dx, dy;\n if (!position1) return;\n dx = position1[0] - position0[0];\n dy = position1[1] - position0[1];\n dragged |= dx | dy;\n position0 = position1;\n dispatch({\n type: \"drag\",\n x: position1[0] + dragOffset[0],\n y: position1[1] + dragOffset[1],\n dx: dx,\n dy: dy\n });\n }\n function ended() {\n if (!position(parent, dragId)) return;\n dragSubject.on(move + dragName, null).on(end + dragName, null);\n dragRestore(dragged);\n dispatch({\n type: \"dragend\"\n });\n }\n };\n }\n drag.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return drag;\n };\n return d3.rebind(drag, event, \"on\");\n };\n function d3_behavior_dragTouchId() {\n return d3.event.changedTouches[0].identifier;\n }\n d3.touches = function(container, touches) {\n if (arguments.length < 2) touches = d3_eventSource().touches;\n return touches ? d3_array(touches).map(function(touch) {\n var point = d3_mousePoint(container, touch);\n point.identifier = touch.identifier;\n return point;\n }) : [];\n };\n var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n function d3_sgn(x) {\n return x > 0 ? 1 : x < 0 ? -1 : 0;\n }\n function d3_cross2d(a, b, c) {\n return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n }\n function d3_acos(x) {\n return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n }\n function d3_asin(x) {\n return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n }\n function d3_sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n }\n function d3_cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n }\n function d3_tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n }\n function d3_haversin(x) {\n return (x = Math.sin(x / 2)) * x;\n }\n var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n d3.interpolateZoom = function(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n if (d2 < ε2) {\n S = Math.log(w1 / w0) / ρ;\n i = function(t) {\n return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n };\n } else {\n var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / ρ;\n i = function(t) {\n var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n };\n }\n i.duration = S * 1e3;\n return i;\n };\n d3.behavior.zoom = function() {\n var view = {\n x: 0,\n y: 0,\n k: 1\n }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n if (!d3_behavior_zoomWheel) {\n d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n return d3.event.wheelDelta;\n }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n return -d3.event.detail;\n }, \"MozMousePixelScroll\");\n }\n function zoom(g) {\n g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n }\n zoom.event = function(g) {\n g.each(function() {\n var dispatch = event.of(this, arguments), view1 = view;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.zoom\", function() {\n view = this.__chart__ || {\n x: 0,\n y: 0,\n k: 1\n };\n zoomstarted(dispatch);\n }).tween(\"zoom:zoom\", function() {\n var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n return function(t) {\n var l = i(t), k = dx / l[2];\n this.__chart__ = view = {\n x: cx - l[0] * k,\n y: cy - l[1] * k,\n k: k\n };\n zoomed(dispatch);\n };\n }).each(\"interrupt.zoom\", function() {\n zoomended(dispatch);\n }).each(\"end.zoom\", function() {\n zoomended(dispatch);\n });\n } else {\n this.__chart__ = view;\n zoomstarted(dispatch);\n zoomed(dispatch);\n zoomended(dispatch);\n }\n });\n };\n zoom.translate = function(_) {\n if (!arguments.length) return [ view.x, view.y ];\n view = {\n x: +_[0],\n y: +_[1],\n k: view.k\n };\n rescale();\n return zoom;\n };\n zoom.scale = function(_) {\n if (!arguments.length) return view.k;\n view = {\n x: view.x,\n y: view.y,\n k: null\n };\n scaleTo(+_);\n rescale();\n return zoom;\n };\n zoom.scaleExtent = function(_) {\n if (!arguments.length) return scaleExtent;\n scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.center = function(_) {\n if (!arguments.length) return center;\n center = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.size = function(_) {\n if (!arguments.length) return size;\n size = _ && [ +_[0], +_[1] ];\n return zoom;\n };\n zoom.duration = function(_) {\n if (!arguments.length) return duration;\n duration = +_;\n return zoom;\n };\n zoom.x = function(z) {\n if (!arguments.length) return x1;\n x1 = z;\n x0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n zoom.y = function(z) {\n if (!arguments.length) return y1;\n y1 = z;\n y0 = z.copy();\n view = {\n x: 0,\n y: 0,\n k: 1\n };\n return zoom;\n };\n function location(p) {\n return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n }\n function point(l) {\n return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n }\n function scaleTo(s) {\n view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n }\n function translateTo(p, l) {\n l = point(l);\n view.x += p[0] - l[0];\n view.y += p[1] - l[1];\n }\n function zoomTo(that, p, l, k) {\n that.__chart__ = {\n x: view.x,\n y: view.y,\n k: view.k\n };\n scaleTo(Math.pow(2, k));\n translateTo(center0 = p, l);\n that = d3.select(that);\n if (duration > 0) that = that.transition().duration(duration);\n that.call(zoom.event);\n }\n function rescale() {\n if (x1) x1.domain(x0.range().map(function(x) {\n return (x - view.x) / view.k;\n }).map(x0.invert));\n if (y1) y1.domain(y0.range().map(function(y) {\n return (y - view.y) / view.k;\n }).map(y0.invert));\n }\n function zoomstarted(dispatch) {\n if (!zooming++) dispatch({\n type: \"zoomstart\"\n });\n }\n function zoomed(dispatch) {\n rescale();\n dispatch({\n type: \"zoom\",\n scale: view.k,\n translate: [ view.x, view.y ]\n });\n }\n function zoomended(dispatch) {\n if (!--zooming) dispatch({\n type: \"zoomend\"\n }), center0 = null;\n }\n function mousedowned() {\n var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n d3_selection_interrupt.call(that);\n zoomstarted(dispatch);\n function moved() {\n dragged = 1;\n translateTo(d3.mouse(that), location0);\n zoomed(dispatch);\n }\n function ended() {\n subject.on(mousemove, null).on(mouseup, null);\n dragRestore(dragged);\n zoomended(dispatch);\n }\n }\n function touchstarted() {\n var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n started();\n zoomstarted(dispatch);\n subject.on(mousedown, null).on(touchstart, started);\n function relocate() {\n var touches = d3.touches(that);\n scale0 = view.k;\n touches.forEach(function(t) {\n if (t.identifier in locations0) locations0[t.identifier] = location(t);\n });\n return touches;\n }\n function started() {\n var target = d3.event.target;\n d3.select(target).on(touchmove, moved).on(touchend, ended);\n targets.push(target);\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n locations0[changed[i].identifier] = null;\n }\n var touches = relocate(), now = Date.now();\n if (touches.length === 1) {\n if (now - touchtime < 500) {\n var p = touches[0];\n zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n d3_eventPreventDefault();\n }\n touchtime = now;\n } else if (touches.length > 1) {\n var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n distance0 = dx * dx + dy * dy;\n }\n }\n function moved() {\n var touches = d3.touches(that), p0, l0, p1, l1;\n d3_selection_interrupt.call(that);\n for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n p1 = touches[i];\n if (l1 = locations0[p1.identifier]) {\n if (l0) break;\n p0 = p1, l0 = l1;\n }\n }\n if (l1) {\n var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n scaleTo(scale1 * scale0);\n }\n touchtime = null;\n translateTo(p0, l0);\n zoomed(dispatch);\n }\n function ended() {\n if (d3.event.touches.length) {\n var changed = d3.event.changedTouches;\n for (var i = 0, n = changed.length; i < n; ++i) {\n delete locations0[changed[i].identifier];\n }\n for (var identifier in locations0) {\n return void relocate();\n }\n }\n d3.selectAll(targets).on(zoomName, null);\n subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n dragRestore();\n zoomended(dispatch);\n }\n }\n function mousewheeled() {\n var dispatch = event.of(this, arguments);\n if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n mousewheelTimer = setTimeout(function() {\n mousewheelTimer = null;\n zoomended(dispatch);\n }, 50);\n d3_eventPreventDefault();\n scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n translateTo(center0, translate0);\n zoomed(dispatch);\n }\n function dblclicked() {\n var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n }\n return d3.rebind(zoom, event, \"on\");\n };\n var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n d3.color = d3_color;\n function d3_color() {}\n d3_color.prototype.toString = function() {\n return this.rgb() + \"\";\n };\n d3.hsl = d3_hsl;\n function d3_hsl(h, s, l) {\n return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n }\n var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n d3_hslPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, this.l / k);\n };\n d3_hslPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_hsl(this.h, this.s, k * this.l);\n };\n d3_hslPrototype.rgb = function() {\n return d3_hsl_rgb(this.h, this.s, this.l);\n };\n function d3_hsl_rgb(h, s, l) {\n var m1, m2;\n h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n l = l < 0 ? 0 : l > 1 ? 1 : l;\n m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n m1 = 2 * l - m2;\n function v(h) {\n if (h > 360) h -= 360; else if (h < 0) h += 360;\n if (h < 60) return m1 + (m2 - m1) * h / 60;\n if (h < 180) return m2;\n if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n return m1;\n }\n function vv(h) {\n return Math.round(v(h) * 255);\n }\n return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n }\n d3.hcl = d3_hcl;\n function d3_hcl(h, c, l) {\n return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n }\n var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n d3_hclPrototype.brighter = function(k) {\n return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.darker = function(k) {\n return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n };\n d3_hclPrototype.rgb = function() {\n return d3_hcl_lab(this.h, this.c, this.l).rgb();\n };\n function d3_hcl_lab(h, c, l) {\n if (isNaN(h)) h = 0;\n if (isNaN(c)) c = 0;\n return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n }\n d3.lab = d3_lab;\n function d3_lab(l, a, b) {\n return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n }\n var d3_lab_K = 18;\n var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n var d3_labPrototype = d3_lab.prototype = new d3_color();\n d3_labPrototype.brighter = function(k) {\n return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.darker = function(k) {\n return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n };\n d3_labPrototype.rgb = function() {\n return d3_lab_rgb(this.l, this.a, this.b);\n };\n function d3_lab_rgb(l, a, b) {\n var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n x = d3_lab_xyz(x) * d3_lab_X;\n y = d3_lab_xyz(y) * d3_lab_Y;\n z = d3_lab_xyz(z) * d3_lab_Z;\n return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n }\n function d3_lab_hcl(l, a, b) {\n return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n }\n function d3_lab_xyz(x) {\n return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n }\n function d3_xyz_lab(x) {\n return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n }\n function d3_xyz_rgb(r) {\n return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n }\n d3.rgb = d3_rgb;\n function d3_rgb(r, g, b) {\n return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n }\n function d3_rgbNumber(value) {\n return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n }\n function d3_rgbString(value) {\n return d3_rgbNumber(value) + \"\";\n }\n var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n d3_rgbPrototype.brighter = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n var r = this.r, g = this.g, b = this.b, i = 30;\n if (!r && !g && !b) return new d3_rgb(i, i, i);\n if (r && r < i) r = i;\n if (g && g < i) g = i;\n if (b && b < i) b = i;\n return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n };\n d3_rgbPrototype.darker = function(k) {\n k = Math.pow(.7, arguments.length ? k : 1);\n return new d3_rgb(k * this.r, k * this.g, k * this.b);\n };\n d3_rgbPrototype.hsl = function() {\n return d3_rgb_hsl(this.r, this.g, this.b);\n };\n d3_rgbPrototype.toString = function() {\n return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n };\n function d3_rgb_hex(v) {\n return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n }\n function d3_rgb_parse(format, rgb, hsl) {\n var r = 0, g = 0, b = 0, m1, m2, color;\n m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n if (m1) {\n m2 = m1[2].split(\",\");\n switch (m1[1]) {\n case \"hsl\":\n {\n return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n }\n\n case \"rgb\":\n {\n return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n }\n }\n }\n if (color = d3_rgb_names.get(format)) {\n return rgb(color.r, color.g, color.b);\n }\n if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n if (format.length === 4) {\n r = (color & 3840) >> 4;\n r = r >> 4 | r;\n g = color & 240;\n g = g >> 4 | g;\n b = color & 15;\n b = b << 4 | b;\n } else if (format.length === 7) {\n r = (color & 16711680) >> 16;\n g = (color & 65280) >> 8;\n b = color & 255;\n }\n }\n return rgb(r, g, b);\n }\n function d3_rgb_hsl(r, g, b) {\n var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n if (d) {\n s = l < .5 ? d / (max + min) : d / (2 - max - min);\n if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n h *= 60;\n } else {\n h = NaN;\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new d3_hsl(h, s, l);\n }\n function d3_rgb_lab(r, g, b) {\n r = d3_rgb_xyz(r);\n g = d3_rgb_xyz(g);\n b = d3_rgb_xyz(b);\n var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n }\n function d3_rgb_xyz(r) {\n return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n }\n function d3_rgb_parseNumber(c) {\n var f = parseFloat(c);\n return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n }\n var d3_rgb_names = d3.map({\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n });\n d3_rgb_names.forEach(function(key, value) {\n d3_rgb_names.set(key, d3_rgbNumber(value));\n });\n function d3_functor(v) {\n return typeof v === \"function\" ? v : function() {\n return v;\n };\n }\n d3.functor = d3_functor;\n d3.xhr = d3_xhrType(d3_identity);\n function d3_xhrType(response) {\n return function(url, mimeType, callback) {\n if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n mimeType = null;\n return d3_xhr(url, mimeType, response, callback);\n };\n }\n function d3_xhr(url, mimeType, response, callback) {\n var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n request.readyState > 3 && respond();\n };\n function respond() {\n var status = request.status, result;\n if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n try {\n result = response.call(xhr, request);\n } catch (e) {\n dispatch.error.call(xhr, e);\n return;\n }\n dispatch.load.call(xhr, result);\n } else {\n dispatch.error.call(xhr, request);\n }\n }\n request.onprogress = function(event) {\n var o = d3.event;\n d3.event = event;\n try {\n dispatch.progress.call(xhr, request);\n } finally {\n d3.event = o;\n }\n };\n xhr.header = function(name, value) {\n name = (name + \"\").toLowerCase();\n if (arguments.length < 2) return headers[name];\n if (value == null) delete headers[name]; else headers[name] = value + \"\";\n return xhr;\n };\n xhr.mimeType = function(value) {\n if (!arguments.length) return mimeType;\n mimeType = value == null ? null : value + \"\";\n return xhr;\n };\n xhr.responseType = function(value) {\n if (!arguments.length) return responseType;\n responseType = value;\n return xhr;\n };\n xhr.response = function(value) {\n response = value;\n return xhr;\n };\n [ \"get\", \"post\" ].forEach(function(method) {\n xhr[method] = function() {\n return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n };\n });\n xhr.send = function(method, data, callback) {\n if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n request.open(method, url, true);\n if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n if (responseType != null) request.responseType = responseType;\n if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n callback(null, request);\n });\n dispatch.beforesend.call(xhr, request);\n request.send(data == null ? null : data);\n return xhr;\n };\n xhr.abort = function() {\n request.abort();\n return xhr;\n };\n d3.rebind(xhr, dispatch, \"on\");\n return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n }\n function d3_xhr_fixCallback(callback) {\n return callback.length === 1 ? function(error, request) {\n callback(error == null ? request : null);\n } : callback;\n }\n function d3_xhrHasResponse(request) {\n var type = request.responseType;\n return type && type !== \"text\" ? request.response : request.responseText;\n }\n d3.dsv = function(delimiter, mimeType) {\n var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n function dsv(url, row, callback) {\n if (arguments.length < 3) callback = row, row = null;\n var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n xhr.row = function(_) {\n return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n };\n return xhr;\n }\n function response(request) {\n return dsv.parse(request.responseText);\n }\n function typedResponse(f) {\n return function(request) {\n return dsv.parse(request.responseText, f);\n };\n }\n dsv.parse = function(text, f) {\n var o;\n return dsv.parseRows(text, function(row, i) {\n if (o) return o(row, i - 1);\n var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n return JSON.stringify(name) + \": d[\" + i + \"]\";\n }).join(\",\") + \"}\");\n o = f ? function(row, i) {\n return f(a(row), i);\n } : a;\n });\n };\n dsv.parseRows = function(text, f) {\n var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n function token() {\n if (I >= N) return EOF;\n if (eol) return eol = false, EOL;\n var j = I;\n if (text.charCodeAt(j) === 34) {\n var i = j;\n while (i++ < N) {\n if (text.charCodeAt(i) === 34) {\n if (text.charCodeAt(i + 1) !== 34) break;\n ++i;\n }\n }\n I = i + 2;\n var c = text.charCodeAt(i + 1);\n if (c === 13) {\n eol = true;\n if (text.charCodeAt(i + 2) === 10) ++I;\n } else if (c === 10) {\n eol = true;\n }\n return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n }\n while (I < N) {\n var c = text.charCodeAt(I++), k = 1;\n if (c === 10) eol = true; else if (c === 13) {\n eol = true;\n if (text.charCodeAt(I) === 10) ++I, ++k;\n } else if (c !== delimiterCode) continue;\n return text.slice(j, I - k);\n }\n return text.slice(j);\n }\n while ((t = token()) !== EOF) {\n var a = [];\n while (t !== EOL && t !== EOF) {\n a.push(t);\n t = token();\n }\n if (f && (a = f(a, n++)) == null) continue;\n rows.push(a);\n }\n return rows;\n };\n dsv.format = function(rows) {\n if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n var fieldSet = new d3_Set(), fields = [];\n rows.forEach(function(row) {\n for (var field in row) {\n if (!fieldSet.has(field)) {\n fields.push(fieldSet.add(field));\n }\n }\n });\n return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n return fields.map(function(field) {\n return formatValue(row[field]);\n }).join(delimiter);\n })).join(\"\\n\");\n };\n dsv.formatRows = function(rows) {\n return rows.map(formatRow).join(\"\\n\");\n };\n function formatRow(row) {\n return row.map(formatValue).join(delimiter);\n }\n function formatValue(text) {\n return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n }\n return dsv;\n };\n d3.csv = d3.dsv(\",\", \"text/csv\");\n d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n setTimeout(callback, 17);\n };\n d3.timer = function() {\n d3_timer.apply(this, arguments);\n };\n function d3_timer(callback, delay, then) {\n var n = arguments.length;\n if (n < 2) delay = 0;\n if (n < 3) then = Date.now();\n var time = then + delay, timer = {\n c: callback,\n t: time,\n n: null\n };\n if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n d3_timer_queueTail = timer;\n if (!d3_timer_interval) {\n d3_timer_timeout = clearTimeout(d3_timer_timeout);\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n return timer;\n }\n function d3_timer_step() {\n var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n if (delay > 24) {\n if (isFinite(delay)) {\n clearTimeout(d3_timer_timeout);\n d3_timer_timeout = setTimeout(d3_timer_step, delay);\n }\n d3_timer_interval = 0;\n } else {\n d3_timer_interval = 1;\n d3_timer_frame(d3_timer_step);\n }\n }\n d3.timer.flush = function() {\n d3_timer_mark();\n d3_timer_sweep();\n };\n function d3_timer_mark() {\n var now = Date.now(), timer = d3_timer_queueHead;\n while (timer) {\n if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n timer = timer.n;\n }\n return now;\n }\n function d3_timer_sweep() {\n var t0, t1 = d3_timer_queueHead, time = Infinity;\n while (t1) {\n if (t1.c) {\n if (t1.t < time) time = t1.t;\n t1 = (t0 = t1).n;\n } else {\n t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n }\n }\n d3_timer_queueTail = t0;\n return time;\n }\n function d3_format_precision(x, p) {\n return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n }\n d3.round = function(x, n) {\n return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n };\n var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n d3.formatPrefix = function(value, precision) {\n var i = 0;\n if (value = +value) {\n if (value < 0) value *= -1;\n if (precision) value = d3.round(value, d3_format_precision(value, precision));\n i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n }\n return d3_formatPrefixes[8 + i / 3];\n };\n function d3_formatPrefix(d, i) {\n var k = Math.pow(10, abs(8 - i) * 3);\n return {\n scale: i > 8 ? function(d) {\n return d / k;\n } : function(d) {\n return d * k;\n },\n symbol: d\n };\n }\n function d3_locale_numberFormat(locale) {\n var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\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 = locale_grouping[j = (j + 1) % locale_grouping.length];\n }\n return t.reverse().join(locale_thousands);\n } : d3_identity;\n return function(specifier) {\n var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n if (precision) precision = +precision.substring(1);\n if (zfill || fill === \"0\" && align === \"=\") {\n zfill = fill = \"0\";\n align = \"=\";\n }\n switch (type) {\n case \"n\":\n comma = true;\n type = \"g\";\n break;\n\n case \"%\":\n scale = 100;\n suffix = \"%\";\n type = \"f\";\n break;\n\n case \"p\":\n scale = 100;\n suffix = \"%\";\n type = \"r\";\n break;\n\n case \"b\":\n case \"o\":\n case \"x\":\n case \"X\":\n if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n case \"c\":\n exponent = false;\n\n case \"d\":\n integer = true;\n precision = 0;\n break;\n\n case \"s\":\n scale = -1;\n type = \"r\";\n break;\n }\n if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n if (type == \"r\" && !precision) type = \"g\";\n if (precision != null) {\n if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n }\n type = d3_format_types.get(type) || d3_format_typeDefault;\n var zcomma = zfill && comma;\n return function(value) {\n var fullSuffix = suffix;\n if (integer && value % 1) return \"\";\n var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n if (scale < 0) {\n var unit = d3.formatPrefix(value, precision);\n value = unit.scale(value);\n fullSuffix = unit.symbol + suffix;\n } else {\n value *= scale;\n }\n value = type(value, precision);\n var i = value.lastIndexOf(\".\"), before, after;\n if (i < 0) {\n var j = exponent ? value.lastIndexOf(\"e\") : -1;\n if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n } else {\n before = value.substring(0, i);\n after = locale_decimal + value.substring(i + 1);\n }\n if (!zfill && comma) before = formatGroup(before, Infinity);\n var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n negative += prefix;\n value = before + after;\n return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n };\n };\n }\n var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n var d3_format_types = d3.map({\n b: function(x) {\n return x.toString(2);\n },\n c: function(x) {\n return String.fromCharCode(x);\n },\n o: function(x) {\n return x.toString(8);\n },\n x: function(x) {\n return x.toString(16);\n },\n X: function(x) {\n return x.toString(16).toUpperCase();\n },\n g: function(x, p) {\n return x.toPrecision(p);\n },\n e: function(x, p) {\n return x.toExponential(p);\n },\n f: function(x, p) {\n return x.toFixed(p);\n },\n r: function(x, p) {\n return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n }\n });\n function d3_format_typeDefault(x) {\n return x + \"\";\n }\n var d3_time = d3.time = {}, d3_date = Date;\n function d3_date_utc() {\n this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n }\n d3_date_utc.prototype = {\n getDate: function() {\n return this._.getUTCDate();\n },\n getDay: function() {\n return this._.getUTCDay();\n },\n getFullYear: function() {\n return this._.getUTCFullYear();\n },\n getHours: function() {\n return this._.getUTCHours();\n },\n getMilliseconds: function() {\n return this._.getUTCMilliseconds();\n },\n getMinutes: function() {\n return this._.getUTCMinutes();\n },\n getMonth: function() {\n return this._.getUTCMonth();\n },\n getSeconds: function() {\n return this._.getUTCSeconds();\n },\n getTime: function() {\n return this._.getTime();\n },\n getTimezoneOffset: function() {\n return 0;\n },\n valueOf: function() {\n return this._.valueOf();\n },\n setDate: function() {\n d3_time_prototype.setUTCDate.apply(this._, arguments);\n },\n setDay: function() {\n d3_time_prototype.setUTCDay.apply(this._, arguments);\n },\n setFullYear: function() {\n d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n },\n setHours: function() {\n d3_time_prototype.setUTCHours.apply(this._, arguments);\n },\n setMilliseconds: function() {\n d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n },\n setMinutes: function() {\n d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n },\n setMonth: function() {\n d3_time_prototype.setUTCMonth.apply(this._, arguments);\n },\n setSeconds: function() {\n d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n },\n setTime: function() {\n d3_time_prototype.setTime.apply(this._, arguments);\n }\n };\n var d3_time_prototype = Date.prototype;\n function d3_time_interval(local, step, number) {\n function round(date) {\n var d0 = local(date), d1 = offset(d0, 1);\n return date - d0 < d1 - date ? d0 : d1;\n }\n function ceil(date) {\n step(date = local(new d3_date(date - 1)), 1);\n return date;\n }\n function offset(date, k) {\n step(date = new d3_date(+date), k);\n return date;\n }\n function range(t0, t1, dt) {\n var time = ceil(t0), times = [];\n if (dt > 1) {\n while (time < t1) {\n if (!(number(time) % dt)) times.push(new Date(+time));\n step(time, 1);\n }\n } else {\n while (time < t1) times.push(new Date(+time)), step(time, 1);\n }\n return times;\n }\n function range_utc(t0, t1, dt) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = t0;\n return range(utc, t1, dt);\n } finally {\n d3_date = Date;\n }\n }\n local.floor = local;\n local.round = round;\n local.ceil = ceil;\n local.offset = offset;\n local.range = range;\n var utc = local.utc = d3_time_interval_utc(local);\n utc.floor = utc;\n utc.round = d3_time_interval_utc(round);\n utc.ceil = d3_time_interval_utc(ceil);\n utc.offset = d3_time_interval_utc(offset);\n utc.range = range_utc;\n return local;\n }\n function d3_time_interval_utc(method) {\n return function(date, k) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date_utc();\n utc._ = date;\n return method(utc, k)._;\n } finally {\n d3_date = Date;\n }\n };\n }\n d3_time.year = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setMonth(0, 1);\n return date;\n }, function(date, offset) {\n date.setFullYear(date.getFullYear() + offset);\n }, function(date) {\n return date.getFullYear();\n });\n d3_time.years = d3_time.year.range;\n d3_time.years.utc = d3_time.year.utc.range;\n d3_time.day = d3_time_interval(function(date) {\n var day = new d3_date(2e3, 0);\n day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n return day;\n }, function(date, offset) {\n date.setDate(date.getDate() + offset);\n }, function(date) {\n return date.getDate() - 1;\n });\n d3_time.days = d3_time.day.range;\n d3_time.days.utc = d3_time.day.utc.range;\n d3_time.dayOfYear = function(date) {\n var year = d3_time.year(date);\n return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n };\n [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n i = 7 - i;\n var interval = d3_time[day] = d3_time_interval(function(date) {\n (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n return date;\n }, function(date, offset) {\n date.setDate(date.getDate() + Math.floor(offset) * 7);\n }, function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n });\n d3_time[day + \"s\"] = interval.range;\n d3_time[day + \"s\"].utc = interval.utc.range;\n d3_time[day + \"OfYear\"] = function(date) {\n var day = d3_time.year(date).getDay();\n return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n };\n });\n d3_time.week = d3_time.sunday;\n d3_time.weeks = d3_time.sunday.range;\n d3_time.weeks.utc = d3_time.sunday.utc.range;\n d3_time.weekOfYear = d3_time.sundayOfYear;\n function d3_locale_timeFormat(locale) {\n var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n function d3_time_format(template) {\n var n = template.length;\n function format(date) {\n var string = [], i = -1, j = 0, c, p, f;\n while (++i < n) {\n if (template.charCodeAt(i) === 37) {\n string.push(template.slice(j, i));\n if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n string.push(c);\n j = i + 1;\n }\n }\n string.push(template.slice(j, i));\n return string.join(\"\");\n }\n format.parse = function(string) {\n var d = {\n y: 1900,\n m: 0,\n d: 1,\n H: 0,\n M: 0,\n S: 0,\n L: 0,\n Z: null\n }, i = d3_time_parse(d, template, string, 0);\n if (i != string.length) return null;\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n date.setFullYear(d.y, 0, 1);\n date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n } else date.setFullYear(d.y, d.m, d.d);\n date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n return localZ ? date._ : date;\n };\n format.toString = function() {\n return template;\n };\n return format;\n }\n function d3_time_parse(date, template, string, j) {\n var c, p, t, i = 0, n = template.length, m = string.length;\n while (i < n) {\n if (j >= m) return -1;\n c = template.charCodeAt(i++);\n if (c === 37) {\n t = template.charAt(i++);\n p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n if (!p || (j = p(date, string, j)) < 0) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n return j;\n }\n d3_time_format.utc = function(template) {\n var local = d3_time_format(template);\n function format(date) {\n try {\n d3_date = d3_date_utc;\n var utc = new d3_date();\n utc._ = date;\n return local(utc);\n } finally {\n d3_date = Date;\n }\n }\n format.parse = function(string) {\n try {\n d3_date = d3_date_utc;\n var date = local.parse(string);\n return date && date._;\n } finally {\n d3_date = Date;\n }\n };\n format.toString = local.toString;\n return format;\n };\n d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n locale_periods.forEach(function(p, i) {\n d3_time_periodLookup.set(p.toLowerCase(), i);\n });\n var d3_time_formats = {\n a: function(d) {\n return locale_shortDays[d.getDay()];\n },\n A: function(d) {\n return locale_days[d.getDay()];\n },\n b: function(d) {\n return locale_shortMonths[d.getMonth()];\n },\n B: function(d) {\n return locale_months[d.getMonth()];\n },\n c: d3_time_format(locale_dateTime),\n d: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n e: function(d, p) {\n return d3_time_formatPad(d.getDate(), p, 2);\n },\n H: function(d, p) {\n return d3_time_formatPad(d.getHours(), p, 2);\n },\n I: function(d, p) {\n return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n },\n j: function(d, p) {\n return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n },\n L: function(d, p) {\n return d3_time_formatPad(d.getMilliseconds(), p, 3);\n },\n m: function(d, p) {\n return d3_time_formatPad(d.getMonth() + 1, p, 2);\n },\n M: function(d, p) {\n return d3_time_formatPad(d.getMinutes(), p, 2);\n },\n p: function(d) {\n return locale_periods[+(d.getHours() >= 12)];\n },\n S: function(d, p) {\n return d3_time_formatPad(d.getSeconds(), p, 2);\n },\n U: function(d, p) {\n return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n },\n w: function(d) {\n return d.getDay();\n },\n W: function(d, p) {\n return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n },\n x: d3_time_format(locale_date),\n X: d3_time_format(locale_time),\n y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n },\n Y: function(d, p) {\n return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n },\n Z: d3_time_zone,\n \"%\": function() {\n return \"%\";\n }\n };\n var d3_time_parsers = {\n a: d3_time_parseWeekdayAbbrev,\n A: d3_time_parseWeekday,\n b: d3_time_parseMonthAbbrev,\n B: d3_time_parseMonth,\n c: d3_time_parseLocaleFull,\n d: d3_time_parseDay,\n e: d3_time_parseDay,\n H: d3_time_parseHour24,\n I: d3_time_parseHour24,\n j: d3_time_parseDayOfYear,\n L: d3_time_parseMilliseconds,\n m: d3_time_parseMonthNumber,\n M: d3_time_parseMinutes,\n p: d3_time_parseAmPm,\n S: d3_time_parseSeconds,\n U: d3_time_parseWeekNumberSunday,\n w: d3_time_parseWeekdayNumber,\n W: d3_time_parseWeekNumberMonday,\n x: d3_time_parseLocaleDate,\n X: d3_time_parseLocaleTime,\n y: d3_time_parseYear,\n Y: d3_time_parseFullYear,\n Z: d3_time_parseZone,\n \"%\": d3_time_parseLiteralPercent\n };\n function d3_time_parseWeekdayAbbrev(date, string, i) {\n d3_time_dayAbbrevRe.lastIndex = 0;\n var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseWeekday(date, string, i) {\n d3_time_dayRe.lastIndex = 0;\n var n = d3_time_dayRe.exec(string.slice(i));\n return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonthAbbrev(date, string, i) {\n d3_time_monthAbbrevRe.lastIndex = 0;\n var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseMonth(date, string, i) {\n d3_time_monthRe.lastIndex = 0;\n var n = d3_time_monthRe.exec(string.slice(i));\n return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n function d3_time_parseLocaleFull(date, string, i) {\n return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n }\n function d3_time_parseLocaleDate(date, string, i) {\n return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n }\n function d3_time_parseLocaleTime(date, string, i) {\n return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n }\n function d3_time_parseAmPm(date, string, i) {\n var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n return n == null ? -1 : (date.p = n, i);\n }\n return d3_time_format;\n }\n var d3_time_formatPads = {\n \"-\": \"\",\n _: \" \",\n \"0\": \"0\"\n }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n function d3_time_formatPad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n }\n function d3_time_formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n }\n function d3_time_formatLookup(names) {\n var map = new d3_Map(), i = -1, n = names.length;\n while (++i < n) map.set(names[i].toLowerCase(), i);\n return map;\n }\n function d3_time_parseWeekdayNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n return n ? (date.w = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberSunday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.U = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseWeekNumberMonday(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i));\n return n ? (date.W = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseFullYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n return n ? (date.y = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n }\n function d3_time_parseZone(date, string, i) {\n return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n i + 5) : -1;\n }\n function d3_time_expandYear(d) {\n return d + (d > 68 ? 1900 : 2e3);\n }\n function d3_time_parseMonthNumber(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n }\n function d3_time_parseDay(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.d = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseDayOfYear(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.j = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseHour24(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.H = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMinutes(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.M = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseSeconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n return n ? (date.S = +n[0], i + n[0].length) : -1;\n }\n function d3_time_parseMilliseconds(date, string, i) {\n d3_time_numberRe.lastIndex = 0;\n var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n return n ? (date.L = +n[0], i + n[0].length) : -1;\n }\n function d3_time_zone(d) {\n var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n }\n function d3_time_parseLiteralPercent(date, string, i) {\n d3_time_percentRe.lastIndex = 0;\n var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n }\n function d3_time_formatMulti(formats) {\n var n = formats.length, i = -1;\n while (++i < n) formats[i][0] = this(formats[i][0]);\n return function(date) {\n var i = 0, f = formats[i];\n while (!f[1](date)) f = formats[++i];\n return f[0](date);\n };\n }\n d3.locale = function(locale) {\n return {\n numberFormat: d3_locale_numberFormat(locale),\n timeFormat: d3_locale_timeFormat(locale)\n };\n };\n var d3_locale_enUS = d3.locale({\n decimal: \".\",\n thousands: \",\",\n grouping: [ 3 ],\n currency: [ \"$\", \"\" ],\n dateTime: \"%a %b %e %X %Y\",\n date: \"%m/%d/%Y\",\n time: \"%H:%M:%S\",\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 d3.format = d3_locale_enUS.numberFormat;\n d3.geo = {};\n function d3_adder() {}\n d3_adder.prototype = {\n s: 0,\n t: 0,\n add: function(y) {\n d3_adderSum(y, this.t, d3_adderTemp);\n d3_adderSum(d3_adderTemp.s, this.s, this);\n if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n },\n reset: function() {\n this.s = this.t = 0;\n },\n valueOf: function() {\n return this.s;\n }\n };\n var d3_adderTemp = new d3_adder();\n function d3_adderSum(a, b, o) {\n var x = o.s = a + b, bv = x - a, av = x - bv;\n o.t = a - av + (b - bv);\n }\n d3.geo.stream = function(object, listener) {\n if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n d3_geo_streamObjectType[object.type](object, listener);\n } else {\n d3_geo_streamGeometry(object, listener);\n }\n };\n function d3_geo_streamGeometry(geometry, listener) {\n if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n d3_geo_streamGeometryType[geometry.type](geometry, listener);\n }\n }\n var d3_geo_streamObjectType = {\n Feature: function(feature, listener) {\n d3_geo_streamGeometry(feature.geometry, listener);\n },\n FeatureCollection: function(object, listener) {\n var features = object.features, i = -1, n = features.length;\n while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n }\n };\n var d3_geo_streamGeometryType = {\n Sphere: function(object, listener) {\n listener.sphere();\n },\n Point: function(object, listener) {\n object = object.coordinates;\n listener.point(object[0], object[1], object[2]);\n },\n MultiPoint: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n },\n LineString: function(object, listener) {\n d3_geo_streamLine(object.coordinates, listener, 0);\n },\n MultiLineString: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n },\n Polygon: function(object, listener) {\n d3_geo_streamPolygon(object.coordinates, listener);\n },\n MultiPolygon: function(object, listener) {\n var coordinates = object.coordinates, i = -1, n = coordinates.length;\n while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n },\n GeometryCollection: function(object, listener) {\n var geometries = object.geometries, i = -1, n = geometries.length;\n while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n }\n };\n function d3_geo_streamLine(coordinates, listener, closed) {\n var i = -1, n = coordinates.length - closed, coordinate;\n listener.lineStart();\n while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n listener.lineEnd();\n }\n function d3_geo_streamPolygon(coordinates, listener) {\n var i = -1, n = coordinates.length;\n listener.polygonStart();\n while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n listener.polygonEnd();\n }\n d3.geo.area = function(object) {\n d3_geo_areaSum = 0;\n d3.geo.stream(object, d3_geo_area);\n return d3_geo_areaSum;\n };\n var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n var d3_geo_area = {\n sphere: function() {\n d3_geo_areaSum += 4 * π;\n },\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_areaRingSum.reset();\n d3_geo_area.lineStart = d3_geo_areaRingStart;\n },\n polygonEnd: function() {\n var area = 2 * d3_geo_areaRingSum;\n d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n }\n };\n function d3_geo_areaRingStart() {\n var λ00, φ00, λ0, cosφ0, sinφ0;\n d3_geo_area.point = function(λ, φ) {\n d3_geo_area.point = nextPoint;\n λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n sinφ0 = Math.sin(φ);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n φ = φ * d3_radians / 2 + π / 4;\n var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n d3_geo_areaRingSum.add(Math.atan2(v, u));\n λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n }\n d3_geo_area.lineEnd = function() {\n nextPoint(λ00, φ00);\n };\n }\n function d3_geo_cartesian(spherical) {\n var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n }\n function d3_geo_cartesianDot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n }\n function d3_geo_cartesianCross(a, b) {\n return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n }\n function d3_geo_cartesianAdd(a, b) {\n a[0] += b[0];\n a[1] += b[1];\n a[2] += b[2];\n }\n function d3_geo_cartesianScale(vector, k) {\n return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n }\n function d3_geo_cartesianNormalize(d) {\n var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n d[0] /= l;\n d[1] /= l;\n d[2] /= l;\n }\n function d3_geo_spherical(cartesian) {\n return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n }\n function d3_geo_sphericalEqual(a, b) {\n return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n }\n d3.geo.bounds = function() {\n var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n var bound = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n bound.point = ringPoint;\n bound.lineStart = ringStart;\n bound.lineEnd = ringEnd;\n dλSum = 0;\n d3_geo_area.polygonStart();\n },\n polygonEnd: function() {\n d3_geo_area.polygonEnd();\n bound.point = point;\n bound.lineStart = lineStart;\n bound.lineEnd = lineEnd;\n if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n range[0] = λ0, range[1] = λ1;\n }\n };\n function point(λ, φ) {\n ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n function linePoint(λ, φ) {\n var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n if (p0) {\n var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n d3_geo_cartesianNormalize(inflection);\n inflection = d3_geo_spherical(inflection);\n var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = inflection[1] * d3_degrees;\n if (φi > φ1) φ1 = φi;\n } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n var φi = -inflection[1] * d3_degrees;\n if (φi < φ0) φ0 = φi;\n } else {\n if (φ < φ0) φ0 = φ;\n if (φ > φ1) φ1 = φ;\n }\n if (antimeridian) {\n if (λ < λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n } else {\n if (λ1 >= λ0) {\n if (λ < λ0) λ0 = λ;\n if (λ > λ1) λ1 = λ;\n } else {\n if (λ > λ_) {\n if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n } else {\n if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n }\n }\n }\n } else {\n point(λ, φ);\n }\n p0 = p, λ_ = λ;\n }\n function lineStart() {\n bound.point = linePoint;\n }\n function lineEnd() {\n range[0] = λ0, range[1] = λ1;\n bound.point = point;\n p0 = null;\n }\n function ringPoint(λ, φ) {\n if (p0) {\n var dλ = λ - λ_;\n dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n } else λ__ = λ, φ__ = φ;\n d3_geo_area.point(λ, φ);\n linePoint(λ, φ);\n }\n function ringStart() {\n d3_geo_area.lineStart();\n }\n function ringEnd() {\n ringPoint(λ__, φ__);\n d3_geo_area.lineEnd();\n if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n range[0] = λ0, range[1] = λ1;\n p0 = null;\n }\n function angle(λ0, λ1) {\n return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n }\n function compareRanges(a, b) {\n return a[0] - b[0];\n }\n function withinRange(x, range) {\n return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n }\n return function(feature) {\n φ1 = λ1 = -(λ0 = φ0 = Infinity);\n ranges = [];\n d3.geo.stream(feature, bound);\n var n = ranges.length;\n if (n) {\n ranges.sort(compareRanges);\n for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n b = ranges[i];\n if (withinRange(b[0], a) || withinRange(b[1], a)) {\n if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n } else {\n merged.push(a = b);\n }\n }\n var best = -Infinity, dλ;\n for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n b = merged[i];\n if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n }\n }\n ranges = range = null;\n return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n };\n }();\n d3.geo.centroid = function(object) {\n d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, d3_geo_centroid);\n var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n if (m < ε2) {\n x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n m = x * x + y * y + z * z;\n if (m < ε2) return [ NaN, NaN ];\n }\n return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n };\n var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n var d3_geo_centroid = {\n sphere: d3_noop,\n point: d3_geo_centroidPoint,\n lineStart: d3_geo_centroidLineStart,\n lineEnd: d3_geo_centroidLineEnd,\n polygonStart: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n }\n };\n function d3_geo_centroidPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n }\n function d3_geo_centroidPointXYZ(x, y, z) {\n ++d3_geo_centroidW0;\n d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n }\n function d3_geo_centroidLineStart() {\n var x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroid.point = nextPoint;\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_centroidLineEnd() {\n d3_geo_centroid.point = d3_geo_centroidPoint;\n }\n function d3_geo_centroidRingStart() {\n var λ00, φ00, x0, y0, z0;\n d3_geo_centroid.point = function(λ, φ) {\n λ00 = λ, φ00 = φ;\n d3_geo_centroid.point = nextPoint;\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians);\n x0 = cosφ * Math.cos(λ);\n y0 = cosφ * Math.sin(λ);\n z0 = Math.sin(φ);\n d3_geo_centroidPointXYZ(x0, y0, z0);\n };\n d3_geo_centroid.lineEnd = function() {\n nextPoint(λ00, φ00);\n d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n d3_geo_centroid.point = d3_geo_centroidPoint;\n };\n function nextPoint(λ, φ) {\n λ *= d3_radians;\n var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n d3_geo_centroidX2 += v * cx;\n d3_geo_centroidY2 += v * cy;\n d3_geo_centroidZ2 += v * cz;\n d3_geo_centroidW1 += w;\n d3_geo_centroidX1 += w * (x0 + (x0 = x));\n d3_geo_centroidY1 += w * (y0 + (y0 = y));\n d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n d3_geo_centroidPointXYZ(x0, y0, z0);\n }\n }\n function d3_geo_compose(a, b) {\n function compose(x, y) {\n return x = a(x, y), b(x[0], x[1]);\n }\n if (a.invert && b.invert) compose.invert = function(x, y) {\n return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n };\n return compose;\n }\n function d3_true() {\n return true;\n }\n function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n var subject = [], clip = [];\n segments.forEach(function(segment) {\n if ((n = segment.length - 1) <= 0) return;\n var n, p0 = segment[0], p1 = segment[n];\n if (d3_geo_sphericalEqual(p0, p1)) {\n listener.lineStart();\n for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n listener.lineEnd();\n return;\n }\n var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n a.o = b;\n subject.push(a);\n clip.push(b);\n a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n a.o = b;\n subject.push(a);\n clip.push(b);\n });\n clip.sort(compare);\n d3_geo_clipPolygonLinkCircular(subject);\n d3_geo_clipPolygonLinkCircular(clip);\n if (!subject.length) return;\n for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n clip[i].e = entry = !entry;\n }\n var start = subject[0], points, point;\n while (1) {\n var current = start, isSubject = true;\n while (current.v) if ((current = current.n) === start) return;\n points = current.z;\n listener.lineStart();\n do {\n current.v = current.o.v = true;\n if (current.e) {\n if (isSubject) {\n for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.n.x, 1, listener);\n }\n current = current.n;\n } else {\n if (isSubject) {\n points = current.p.z;\n for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n } else {\n interpolate(current.x, current.p.x, -1, listener);\n }\n current = current.p;\n }\n current = current.o;\n points = current.z;\n isSubject = !isSubject;\n } while (!current.v);\n listener.lineEnd();\n }\n }\n function d3_geo_clipPolygonLinkCircular(array) {\n if (!(n = array.length)) return;\n var n, i = 0, a = array[0], 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 function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n this.x = point;\n this.z = points;\n this.o = other;\n this.e = entry;\n this.v = false;\n this.n = this.p = null;\n }\n function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n return function(rotate, listener) {\n var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n clip.point = pointRing;\n clip.lineStart = ringStart;\n clip.lineEnd = ringEnd;\n segments = [];\n polygon = [];\n },\n polygonEnd: function() {\n clip.point = point;\n clip.lineStart = lineStart;\n clip.lineEnd = lineEnd;\n segments = d3.merge(segments);\n var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n if (segments.length) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n } else if (clipStartInside) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n segments = polygon = null;\n },\n sphere: function() {\n listener.polygonStart();\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n listener.polygonEnd();\n }\n };\n function point(λ, φ) {\n var point = rotate(λ, φ);\n if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n }\n function pointLine(λ, φ) {\n var point = rotate(λ, φ);\n line.point(point[0], point[1]);\n }\n function lineStart() {\n clip.point = pointLine;\n line.lineStart();\n }\n function lineEnd() {\n clip.point = point;\n line.lineEnd();\n }\n var segments;\n var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n function pointRing(λ, φ) {\n ring.push([ λ, φ ]);\n var point = rotate(λ, φ);\n ringListener.point(point[0], point[1]);\n }\n function ringStart() {\n ringListener.lineStart();\n ring = [];\n }\n function ringEnd() {\n pointRing(ring[0][0], ring[0][1]);\n ringListener.lineEnd();\n var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n ring.pop();\n polygon.push(ring);\n ring = null;\n if (!n) return;\n if (clean & 1) {\n segment = ringSegments[0];\n var n = segment.length - 1, i = -1, point;\n if (n > 0) {\n if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n listener.lineStart();\n while (++i < n) listener.point((point = segment[i])[0], point[1]);\n listener.lineEnd();\n }\n return;\n }\n if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n }\n return clip;\n };\n }\n function d3_geo_clipSegmentLength1(segment) {\n return segment.length > 1;\n }\n function d3_geo_clipBufferListener() {\n var lines = [], line;\n return {\n lineStart: function() {\n lines.push(line = []);\n },\n point: function(λ, φ) {\n line.push([ λ, φ ]);\n },\n lineEnd: d3_noop,\n buffer: function() {\n var buffer = lines;\n lines = [];\n line = null;\n return buffer;\n },\n rejoin: function() {\n if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n }\n };\n }\n function d3_geo_clipSort(a, b) {\n return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n }\n var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n function d3_geo_clipAntimeridianLine(listener) {\n var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n return {\n lineStart: function() {\n listener.lineStart();\n clean = 1;\n },\n point: function(λ1, φ1) {\n var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n if (abs(dλ - π) < ε) {\n listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n listener.point(λ1, φ0);\n clean = 0;\n } else if (sλ0 !== sλ1 && dλ >= π) {\n if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n listener.point(sλ0, φ0);\n listener.lineEnd();\n listener.lineStart();\n listener.point(sλ1, φ0);\n clean = 0;\n }\n listener.point(λ0 = λ1, φ0 = φ1);\n sλ0 = sλ1;\n },\n lineEnd: function() {\n listener.lineEnd();\n λ0 = φ0 = NaN;\n },\n clean: function() {\n return 2 - clean;\n }\n };\n }\n function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n }\n function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n var φ;\n if (from == null) {\n φ = direction * halfπ;\n listener.point(-π, φ);\n listener.point(0, φ);\n listener.point(π, φ);\n listener.point(π, 0);\n listener.point(π, -φ);\n listener.point(0, -φ);\n listener.point(-π, -φ);\n listener.point(-π, 0);\n listener.point(-π, φ);\n } else if (abs(from[0] - to[0]) > ε) {\n var s = from[0] < to[0] ? π : -π;\n φ = direction * s / 2;\n listener.point(-s, φ);\n listener.point(0, φ);\n listener.point(s, φ);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function d3_geo_pointInPolygon(point, polygon) {\n var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n d3_geo_areaRingSum.reset();\n for (var i = 0, n = polygon.length; i < n; ++i) {\n var ring = polygon[i], m = ring.length;\n if (!m) continue;\n var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n while (true) {\n if (j === m) j = 0;\n point = ring[j];\n var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n d3_geo_cartesianNormalize(arc);\n var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n d3_geo_cartesianNormalize(intersection);\n var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n }\n }\n if (!j++) break;\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n }\n }\n return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;\n }\n function d3_geo_clipCircle(radius) {\n var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n function visible(λ, φ) {\n return Math.cos(λ) * Math.cos(φ) > cr;\n }\n function clipLine(listener) {\n var point0, c0, v0, v00, clean;\n return {\n lineStart: function() {\n v00 = v0 = false;\n clean = 1;\n },\n point: function(λ, φ) {\n var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n if (!point0 && (v00 = v0 = v)) listener.lineStart();\n if (v !== v0) {\n point2 = intersect(point0, point1);\n if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n point1[0] += ε;\n point1[1] += ε;\n v = visible(point1[0], point1[1]);\n }\n }\n if (v !== v0) {\n clean = 0;\n if (v) {\n listener.lineStart();\n point2 = intersect(point1, point0);\n listener.point(point2[0], point2[1]);\n } else {\n point2 = intersect(point0, point1);\n listener.point(point2[0], point2[1]);\n listener.lineEnd();\n }\n point0 = point2;\n } else if (notHemisphere && point0 && smallRadius ^ v) {\n var t;\n if (!(c & c0) && (t = intersect(point1, point0, true))) {\n clean = 0;\n if (smallRadius) {\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n } else {\n listener.point(t[1][0], t[1][1]);\n listener.lineEnd();\n listener.lineStart();\n listener.point(t[0][0], t[0][1]);\n }\n }\n }\n if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n listener.point(point1[0], point1[1]);\n }\n point0 = point1, v0 = v, c0 = c;\n },\n lineEnd: function() {\n if (v0) listener.lineEnd();\n point0 = null;\n },\n clean: function() {\n return clean | (v00 && v0) << 1;\n }\n };\n }\n function intersect(a, b, two) {\n var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n if (!determinant) return !two && a;\n var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n d3_geo_cartesianAdd(A, B);\n var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n if (t2 < 0) return;\n var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n d3_geo_cartesianAdd(q, A);\n q = d3_geo_spherical(q);\n if (!two) return q;\n var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n d3_geo_cartesianAdd(q1, A);\n return [ q, d3_geo_spherical(q1) ];\n }\n }\n function code(λ, φ) {\n var r = smallRadius ? radius : π - radius, code = 0;\n if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n return code;\n }\n }\n function d3_geom_clipLine(x0, y0, x1, y1) {\n return function(line) {\n var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\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 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 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 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 if (t0 > 0) line.a = {\n x: ax + t0 * dx,\n y: ay + t0 * dy\n };\n if (t1 < 1) line.b = {\n x: ax + t1 * dx,\n y: ay + t1 * dy\n };\n return line;\n };\n }\n var d3_geo_clipExtentMAX = 1e9;\n d3.geo.clipExtent = function() {\n var x0, y0, x1, y1, stream, clip, clipExtent = {\n stream: function(output) {\n if (stream) stream.valid = false;\n stream = clip(output);\n stream.valid = true;\n return stream;\n },\n extent: function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n if (stream) stream.valid = false, stream = null;\n return clipExtent;\n }\n };\n return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n };\n function d3_geo_clipExtent(x0, y0, x1, y1) {\n return function(listener) {\n var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n var clip = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n listener = bufferListener;\n segments = [];\n polygon = [];\n clean = true;\n },\n polygonEnd: function() {\n listener = listener_;\n segments = d3.merge(segments);\n var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n if (inside || visible) {\n listener.polygonStart();\n if (inside) {\n listener.lineStart();\n interpolate(null, null, 1, listener);\n listener.lineEnd();\n }\n if (visible) {\n d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n }\n listener.polygonEnd();\n }\n segments = polygon = ring = null;\n }\n };\n function insidePolygon(p) {\n var wn = 0, n = polygon.length, y = p[1];\n for (var i = 0; i < n; ++i) {\n for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n b = v[j];\n if (a[1] <= y) {\n if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n } else {\n if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n }\n a = b;\n }\n }\n return wn !== 0;\n }\n function interpolate(from, to, direction, listener) {\n var a = 0, a1 = 0;\n if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n do {\n listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n } while ((a = (a + direction + 4) % 4) !== a1);\n } else {\n listener.point(to[0], to[1]);\n }\n }\n function pointVisible(x, y) {\n return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n }\n function point(x, y) {\n if (pointVisible(x, y)) listener.point(x, y);\n }\n var x__, y__, v__, x_, y_, v_, first, clean;\n function lineStart() {\n clip.point = linePoint;\n if (polygon) polygon.push(ring = []);\n first = true;\n v_ = false;\n x_ = y_ = NaN;\n }\n function lineEnd() {\n if (segments) {\n linePoint(x__, y__);\n if (v__ && v_) bufferListener.rejoin();\n segments.push(bufferListener.buffer());\n }\n clip.point = point;\n if (v_) listener.lineEnd();\n }\n function linePoint(x, y) {\n x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n var v = pointVisible(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 listener.lineStart();\n listener.point(x, y);\n }\n } else {\n if (v && v_) listener.point(x, y); else {\n var l = {\n a: {\n x: x_,\n y: y_\n },\n b: {\n x: x,\n y: y\n }\n };\n if (clipLine(l)) {\n if (!v_) {\n listener.lineStart();\n listener.point(l.a.x, l.a.y);\n }\n listener.point(l.b.x, l.b.y);\n if (!v) listener.lineEnd();\n clean = false;\n } else if (v) {\n listener.lineStart();\n listener.point(x, y);\n clean = false;\n }\n }\n }\n x_ = x, y_ = y, v_ = v;\n }\n return clip;\n };\n function corner(p, direction) {\n return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n }\n function compare(a, b) {\n return comparePoints(a.x, b.x);\n }\n function comparePoints(a, b) {\n var ca = corner(a, 1), cb = corner(b, 1);\n return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n }\n }\n function d3_geo_conic(projectAt) {\n var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n p.parallels = function(_) {\n if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n };\n return p;\n }\n function d3_geo_conicEqualArea(φ0, φ1) {\n var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n function forward(λ, φ) {\n var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = ρ0 - y;\n return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n };\n return forward;\n }\n (d3.geo.conicEqualArea = function() {\n return d3_geo_conic(d3_geo_conicEqualArea);\n }).raw = d3_geo_conicEqualArea;\n d3.geo.albers = function() {\n return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n };\n d3.geo.albersUsa = function() {\n var lower48 = d3.geo.albers();\n var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n var point, pointStream = {\n point: function(x, y) {\n point = [ x, y ];\n }\n }, lower48Point, alaskaPoint, hawaiiPoint;\n function albersUsa(coordinates) {\n var x = coordinates[0], y = coordinates[1];\n point = null;\n (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n return point;\n }\n albersUsa.invert = function(coordinates) {\n var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n };\n albersUsa.stream = function(stream) {\n var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n return {\n point: function(x, y) {\n lower48Stream.point(x, y);\n alaskaStream.point(x, y);\n hawaiiStream.point(x, y);\n },\n sphere: function() {\n lower48Stream.sphere();\n alaskaStream.sphere();\n hawaiiStream.sphere();\n },\n lineStart: function() {\n lower48Stream.lineStart();\n alaskaStream.lineStart();\n hawaiiStream.lineStart();\n },\n lineEnd: function() {\n lower48Stream.lineEnd();\n alaskaStream.lineEnd();\n hawaiiStream.lineEnd();\n },\n polygonStart: function() {\n lower48Stream.polygonStart();\n alaskaStream.polygonStart();\n hawaiiStream.polygonStart();\n },\n polygonEnd: function() {\n lower48Stream.polygonEnd();\n alaskaStream.polygonEnd();\n hawaiiStream.polygonEnd();\n }\n };\n };\n albersUsa.precision = function(_) {\n if (!arguments.length) return lower48.precision();\n lower48.precision(_);\n alaska.precision(_);\n hawaii.precision(_);\n return albersUsa;\n };\n albersUsa.scale = function(_) {\n if (!arguments.length) return lower48.scale();\n lower48.scale(_);\n alaska.scale(_ * .35);\n hawaii.scale(_);\n return albersUsa.translate(lower48.translate());\n };\n albersUsa.translate = function(_) {\n if (!arguments.length) return lower48.translate();\n var k = lower48.scale(), x = +_[0], y = +_[1];\n lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n return albersUsa;\n };\n return albersUsa.scale(1070);\n };\n var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n point: d3_noop,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: function() {\n d3_geo_pathAreaPolygon = 0;\n d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n }\n };\n function d3_geo_pathAreaRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathArea.point = function(x, y) {\n d3_geo_pathArea.point = nextPoint;\n x00 = x0 = x, y00 = y0 = y;\n };\n function nextPoint(x, y) {\n d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n x0 = x, y0 = y;\n }\n d3_geo_pathArea.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n var d3_geo_pathBounds = {\n point: d3_geo_pathBoundsPoint,\n lineStart: d3_noop,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_pathBoundsPoint(x, y) {\n if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n }\n function d3_geo_pathBuffer() {\n var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointCircle = d3_geo_pathBufferCircle(_);\n return stream;\n },\n result: function() {\n if (buffer.length) {\n var result = buffer.join(\"\");\n buffer = [];\n return result;\n }\n }\n };\n function point(x, y) {\n buffer.push(\"M\", x, \",\", y, pointCircle);\n }\n function pointLineStart(x, y) {\n buffer.push(\"M\", x, \",\", y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n buffer.push(\"L\", x, \",\", y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n buffer.push(\"Z\");\n }\n return stream;\n }\n function d3_geo_pathBufferCircle(radius) {\n return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n }\n var d3_geo_pathCentroid = {\n point: d3_geo_pathCentroidPoint,\n lineStart: d3_geo_pathCentroidLineStart,\n lineEnd: d3_geo_pathCentroidLineEnd,\n polygonStart: function() {\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n },\n polygonEnd: function() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n }\n };\n function d3_geo_pathCentroidPoint(x, y) {\n d3_geo_centroidX0 += x;\n d3_geo_centroidY0 += y;\n ++d3_geo_centroidZ0;\n }\n function d3_geo_pathCentroidLineStart() {\n var x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n }\n function d3_geo_pathCentroidLineEnd() {\n d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n }\n function d3_geo_pathCentroidRingStart() {\n var x00, y00, x0, y0;\n d3_geo_pathCentroid.point = function(x, y) {\n d3_geo_pathCentroid.point = nextPoint;\n d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n };\n function nextPoint(x, y) {\n var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n d3_geo_centroidX1 += z * (x0 + x) / 2;\n d3_geo_centroidY1 += z * (y0 + y) / 2;\n d3_geo_centroidZ1 += z;\n z = y0 * x - x0 * y;\n d3_geo_centroidX2 += z * (x0 + x);\n d3_geo_centroidY2 += z * (y0 + y);\n d3_geo_centroidZ2 += z * 3;\n d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n }\n d3_geo_pathCentroid.lineEnd = function() {\n nextPoint(x00, y00);\n };\n }\n function d3_geo_pathContext(context) {\n var pointRadius = 4.5;\n var stream = {\n point: point,\n lineStart: function() {\n stream.point = pointLineStart;\n },\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.lineEnd = lineEndPolygon;\n },\n polygonEnd: function() {\n stream.lineEnd = lineEnd;\n stream.point = point;\n },\n pointRadius: function(_) {\n pointRadius = _;\n return stream;\n },\n result: d3_noop\n };\n function point(x, y) {\n context.moveTo(x + pointRadius, y);\n context.arc(x, y, pointRadius, 0, τ);\n }\n function pointLineStart(x, y) {\n context.moveTo(x, y);\n stream.point = pointLine;\n }\n function pointLine(x, y) {\n context.lineTo(x, y);\n }\n function lineEnd() {\n stream.point = point;\n }\n function lineEndPolygon() {\n context.closePath();\n }\n return stream;\n }\n function d3_geo_resample(project) {\n var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n function resample(stream) {\n return (maxDepth ? resampleRecursive : resampleNone)(stream);\n }\n function resampleNone(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n });\n }\n function resampleRecursive(stream) {\n var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n var resample = {\n point: point,\n lineStart: lineStart,\n lineEnd: lineEnd,\n polygonStart: function() {\n stream.polygonStart();\n resample.lineStart = ringStart;\n },\n polygonEnd: function() {\n stream.polygonEnd();\n resample.lineStart = lineStart;\n }\n };\n function point(x, y) {\n x = project(x, y);\n stream.point(x[0], x[1]);\n }\n function lineStart() {\n x0 = NaN;\n resample.point = linePoint;\n stream.lineStart();\n }\n function linePoint(λ, φ) {\n var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n stream.point(x0, y0);\n }\n function lineEnd() {\n resample.point = point;\n stream.lineEnd();\n }\n function ringStart() {\n lineStart();\n resample.point = ringPoint;\n resample.lineEnd = ringEnd;\n }\n function ringPoint(λ, φ) {\n linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n resample.point = linePoint;\n }\n function ringEnd() {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n resample.lineEnd = lineEnd;\n lineEnd();\n }\n return resample;\n }\n function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n if (d2 > 4 * δ2 && depth--) {\n var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n stream.point(x2, y2);\n resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n }\n }\n }\n resample.precision = function(_) {\n if (!arguments.length) return Math.sqrt(δ2);\n maxDepth = (δ2 = _ * _) > 0 && 16;\n return resample;\n };\n return resample;\n }\n d3.geo.path = function() {\n var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n function path(object) {\n if (object) {\n if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n d3.geo.stream(object, cacheStream);\n }\n return contextStream.result();\n }\n path.area = function(object) {\n d3_geo_pathAreaSum = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathArea));\n return d3_geo_pathAreaSum;\n };\n path.centroid = function(object) {\n d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n };\n path.bounds = function(object) {\n d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n };\n path.projection = function(_) {\n if (!arguments.length) return projection;\n projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n return reset();\n };\n path.context = function(_) {\n if (!arguments.length) return context;\n contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n return reset();\n };\n path.pointRadius = function(_) {\n if (!arguments.length) return pointRadius;\n pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n return path;\n };\n function reset() {\n cacheStream = null;\n return path;\n }\n return path.projection(d3.geo.albersUsa()).context(null);\n };\n function d3_geo_pathProjectStream(project) {\n var resample = d3_geo_resample(function(x, y) {\n return project([ x * d3_degrees, y * d3_degrees ]);\n });\n return function(stream) {\n return d3_geo_projectionRadians(resample(stream));\n };\n }\n d3.geo.transform = function(methods) {\n return {\n stream: function(stream) {\n var transform = new d3_geo_transform(stream);\n for (var k in methods) transform[k] = methods[k];\n return transform;\n }\n };\n };\n function d3_geo_transform(stream) {\n this.stream = stream;\n }\n d3_geo_transform.prototype = {\n point: function(x, y) {\n this.stream.point(x, y);\n },\n sphere: function() {\n this.stream.sphere();\n },\n lineStart: function() {\n this.stream.lineStart();\n },\n lineEnd: function() {\n this.stream.lineEnd();\n },\n polygonStart: function() {\n this.stream.polygonStart();\n },\n polygonEnd: function() {\n this.stream.polygonEnd();\n }\n };\n function d3_geo_transformPoint(stream, point) {\n return {\n point: point,\n sphere: function() {\n stream.sphere();\n },\n lineStart: function() {\n stream.lineStart();\n },\n lineEnd: function() {\n stream.lineEnd();\n },\n polygonStart: function() {\n stream.polygonStart();\n },\n polygonEnd: function() {\n stream.polygonEnd();\n }\n };\n }\n d3.geo.projection = d3_geo_projection;\n d3.geo.projectionMutator = d3_geo_projectionMutator;\n function d3_geo_projection(project) {\n return d3_geo_projectionMutator(function() {\n return project;\n })();\n }\n function d3_geo_projectionMutator(projectAt) {\n var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n x = project(x, y);\n return [ x[0] * k + δx, δy - x[1] * k ];\n }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n function projection(point) {\n point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n return [ point[0] * k + δx, δy - point[1] * k ];\n }\n function invert(point) {\n point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n }\n projection.stream = function(output) {\n if (stream) stream.valid = false;\n stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n stream.valid = true;\n return stream;\n };\n projection.clipAngle = function(_) {\n if (!arguments.length) return clipAngle;\n preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n return invalidate();\n };\n projection.clipExtent = function(_) {\n if (!arguments.length) return clipExtent;\n clipExtent = _;\n postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n return invalidate();\n };\n projection.scale = function(_) {\n if (!arguments.length) return k;\n k = +_;\n return reset();\n };\n projection.translate = function(_) {\n if (!arguments.length) return [ x, y ];\n x = +_[0];\n y = +_[1];\n return reset();\n };\n projection.center = function(_) {\n if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n λ = _[0] % 360 * d3_radians;\n φ = _[1] % 360 * d3_radians;\n return reset();\n };\n projection.rotate = function(_) {\n if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n δλ = _[0] % 360 * d3_radians;\n δφ = _[1] % 360 * d3_radians;\n δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n return reset();\n };\n d3.rebind(projection, projectResample, \"precision\");\n function reset() {\n projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n var center = project(λ, φ);\n δx = x - center[0] * k;\n δy = y + center[1] * k;\n return invalidate();\n }\n function invalidate() {\n if (stream) stream.valid = false, stream = null;\n return projection;\n }\n return function() {\n project = projectAt.apply(this, arguments);\n projection.invert = project.invert && invert;\n return reset();\n };\n }\n function d3_geo_projectionRadians(stream) {\n return d3_geo_transformPoint(stream, function(x, y) {\n stream.point(x * d3_radians, y * d3_radians);\n });\n }\n function d3_geo_equirectangular(λ, φ) {\n return [ λ, φ ];\n }\n (d3.geo.equirectangular = function() {\n return d3_geo_projection(d3_geo_equirectangular);\n }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n d3.geo.rotation = function(rotate) {\n rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n function forward(coordinates) {\n coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n }\n forward.invert = function(coordinates) {\n coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n };\n return forward;\n };\n function d3_geo_identityRotation(λ, φ) {\n return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n }\n d3_geo_identityRotation.invert = d3_geo_equirectangular;\n function d3_geo_rotation(δλ, δφ, δγ) {\n return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n }\n function d3_geo_forwardRotationλ(δλ) {\n return function(λ, φ) {\n return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n };\n }\n function d3_geo_rotationλ(δλ) {\n var rotation = d3_geo_forwardRotationλ(δλ);\n rotation.invert = d3_geo_forwardRotationλ(-δλ);\n return rotation;\n }\n function d3_geo_rotationφγ(δφ, δγ) {\n var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n function rotation(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n }\n rotation.invert = function(λ, φ) {\n var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n };\n return rotation;\n }\n d3.geo.circle = function() {\n var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n function circle() {\n var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n interpolate(null, null, 1, {\n point: function(x, y) {\n ring.push(x = rotate(x, y));\n x[0] *= d3_degrees, x[1] *= d3_degrees;\n }\n });\n return {\n type: \"Polygon\",\n coordinates: [ ring ]\n };\n }\n circle.origin = function(x) {\n if (!arguments.length) return origin;\n origin = x;\n return circle;\n };\n circle.angle = function(x) {\n if (!arguments.length) return angle;\n interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n return circle;\n };\n circle.precision = function(_) {\n if (!arguments.length) return precision;\n interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n return circle;\n };\n return circle.angle(90);\n };\n function d3_geo_circleInterpolate(radius, precision) {\n var cr = Math.cos(radius), sr = Math.sin(radius);\n return function(from, to, direction, listener) {\n var step = direction * precision;\n if (from != null) {\n from = d3_geo_circleAngle(cr, from);\n to = d3_geo_circleAngle(cr, to);\n if (direction > 0 ? from < to : from > to) from += direction * τ;\n } else {\n from = radius + direction * τ;\n to = radius - .5 * step;\n }\n for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n }\n };\n }\n function d3_geo_circleAngle(cr, point) {\n var a = d3_geo_cartesian(point);\n a[0] -= cr;\n d3_geo_cartesianNormalize(a);\n var angle = d3_acos(-a[1]);\n return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n }\n d3.geo.distance = function(a, b) {\n var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n };\n d3.geo.graticule = function() {\n var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n function graticule() {\n return {\n type: \"MultiLineString\",\n coordinates: lines()\n };\n }\n function lines() {\n return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n return abs(x % DX) > ε;\n }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n return abs(y % DY) > ε;\n }).map(y));\n }\n graticule.lines = function() {\n return lines().map(function(coordinates) {\n return {\n type: \"LineString\",\n coordinates: coordinates\n };\n });\n };\n graticule.outline = function() {\n return {\n type: \"Polygon\",\n coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n };\n };\n graticule.extent = function(_) {\n if (!arguments.length) return graticule.minorExtent();\n return graticule.majorExtent(_).minorExtent(_);\n };\n graticule.majorExtent = function(_) {\n if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n X0 = +_[0][0], X1 = +_[1][0];\n Y0 = +_[0][1], Y1 = +_[1][1];\n if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n return graticule.precision(precision);\n };\n graticule.minorExtent = function(_) {\n if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n x0 = +_[0][0], x1 = +_[1][0];\n y0 = +_[0][1], y1 = +_[1][1];\n if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n return graticule.precision(precision);\n };\n graticule.step = function(_) {\n if (!arguments.length) return graticule.minorStep();\n return graticule.majorStep(_).minorStep(_);\n };\n graticule.majorStep = function(_) {\n if (!arguments.length) return [ DX, DY ];\n DX = +_[0], DY = +_[1];\n return graticule;\n };\n graticule.minorStep = function(_) {\n if (!arguments.length) return [ dx, dy ];\n dx = +_[0], dy = +_[1];\n return graticule;\n };\n graticule.precision = function(_) {\n if (!arguments.length) return precision;\n precision = +_;\n x = d3_geo_graticuleX(y0, y1, 90);\n y = d3_geo_graticuleY(x0, x1, precision);\n X = d3_geo_graticuleX(Y0, Y1, 90);\n Y = d3_geo_graticuleY(X0, X1, precision);\n return graticule;\n };\n return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n };\n function d3_geo_graticuleX(y0, y1, dy) {\n var y = d3.range(y0, y1 - ε, dy).concat(y1);\n return function(x) {\n return y.map(function(y) {\n return [ x, y ];\n });\n };\n }\n function d3_geo_graticuleY(x0, x1, dx) {\n var x = d3.range(x0, x1 - ε, dx).concat(x1);\n return function(y) {\n return x.map(function(x) {\n return [ x, y ];\n });\n };\n }\n function d3_source(d) {\n return d.source;\n }\n function d3_target(d) {\n return d.target;\n }\n d3.geo.greatArc = function() {\n var source = d3_source, source_, target = d3_target, target_;\n function greatArc() {\n return {\n type: \"LineString\",\n coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n };\n }\n greatArc.distance = function() {\n return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n };\n greatArc.source = function(_) {\n if (!arguments.length) return source;\n source = _, source_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.target = function(_) {\n if (!arguments.length) return target;\n target = _, target_ = typeof _ === \"function\" ? null : _;\n return greatArc;\n };\n greatArc.precision = function() {\n return arguments.length ? greatArc : 0;\n };\n return greatArc;\n };\n d3.geo.interpolate = function(source, target) {\n return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n };\n function d3_geo_interpolate(x0, y0, x1, y1) {\n var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n var interpolate = d ? function(t) {\n var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n } : function() {\n return [ x0 * d3_degrees, y0 * d3_degrees ];\n };\n interpolate.distance = d;\n return interpolate;\n }\n d3.geo.length = function(object) {\n d3_geo_lengthSum = 0;\n d3.geo.stream(object, d3_geo_length);\n return d3_geo_lengthSum;\n };\n var d3_geo_lengthSum;\n var d3_geo_length = {\n sphere: d3_noop,\n point: d3_noop,\n lineStart: d3_geo_lengthLineStart,\n lineEnd: d3_noop,\n polygonStart: d3_noop,\n polygonEnd: d3_noop\n };\n function d3_geo_lengthLineStart() {\n var λ0, sinφ0, cosφ0;\n d3_geo_length.point = function(λ, φ) {\n λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n d3_geo_length.point = nextPoint;\n };\n d3_geo_length.lineEnd = function() {\n d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n };\n function nextPoint(λ, φ) {\n var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n }\n }\n function d3_geo_azimuthal(scale, angle) {\n function azimuthal(λ, φ) {\n var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n }\n azimuthal.invert = function(x, y) {\n var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n };\n return azimuthal;\n }\n var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n return Math.sqrt(2 / (1 + cosλcosφ));\n }, function(ρ) {\n return 2 * Math.asin(ρ / 2);\n });\n (d3.geo.azimuthalEqualArea = function() {\n return d3_geo_projection(d3_geo_azimuthalEqualArea);\n }).raw = d3_geo_azimuthalEqualArea;\n var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n var c = Math.acos(cosλcosφ);\n return c && c / Math.sin(c);\n }, d3_identity);\n (d3.geo.azimuthalEquidistant = function() {\n return d3_geo_projection(d3_geo_azimuthalEquidistant);\n }).raw = d3_geo_azimuthalEquidistant;\n function d3_geo_conicConformal(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), t = function(φ) {\n return Math.tan(π / 4 + φ / 2);\n }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n if (!n) return d3_geo_mercator;\n function forward(λ, φ) {\n if (F > 0) {\n if (φ < -halfπ + ε) φ = -halfπ + ε;\n } else {\n if (φ > halfπ - ε) φ = halfπ - ε;\n }\n var ρ = F / Math.pow(t(φ), n);\n return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n };\n return forward;\n }\n (d3.geo.conicConformal = function() {\n return d3_geo_conic(d3_geo_conicConformal);\n }).raw = d3_geo_conicConformal;\n function d3_geo_conicEquidistant(φ0, φ1) {\n var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n if (abs(n) < ε) return d3_geo_equirectangular;\n function forward(λ, φ) {\n var ρ = G - φ;\n return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n }\n forward.invert = function(x, y) {\n var ρ0_y = G - y;\n return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n };\n return forward;\n }\n (d3.geo.conicEquidistant = function() {\n return d3_geo_conic(d3_geo_conicEquidistant);\n }).raw = d3_geo_conicEquidistant;\n var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / cosλcosφ;\n }, Math.atan);\n (d3.geo.gnomonic = function() {\n return d3_geo_projection(d3_geo_gnomonic);\n }).raw = d3_geo_gnomonic;\n function d3_geo_mercator(λ, φ) {\n return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n }\n d3_geo_mercator.invert = function(x, y) {\n return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n };\n function d3_geo_mercatorProjection(project) {\n var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n m.scale = function() {\n var v = scale.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.translate = function() {\n var v = translate.apply(m, arguments);\n return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n };\n m.clipExtent = function(_) {\n var v = clipExtent.apply(m, arguments);\n if (v === m) {\n if (clipAuto = _ == null) {\n var k = π * scale(), t = translate();\n clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n }\n } else if (clipAuto) {\n v = null;\n }\n return v;\n };\n return m.clipExtent(null);\n }\n (d3.geo.mercator = function() {\n return d3_geo_mercatorProjection(d3_geo_mercator);\n }).raw = d3_geo_mercator;\n var d3_geo_orthographic = d3_geo_azimuthal(function() {\n return 1;\n }, Math.asin);\n (d3.geo.orthographic = function() {\n return d3_geo_projection(d3_geo_orthographic);\n }).raw = d3_geo_orthographic;\n var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n return 1 / (1 + cosλcosφ);\n }, function(ρ) {\n return 2 * Math.atan(ρ);\n });\n (d3.geo.stereographic = function() {\n return d3_geo_projection(d3_geo_stereographic);\n }).raw = d3_geo_stereographic;\n function d3_geo_transverseMercator(λ, φ) {\n return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n }\n d3_geo_transverseMercator.invert = function(x, y) {\n return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n };\n (d3.geo.transverseMercator = function() {\n var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n projection.center = function(_) {\n return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n };\n projection.rotate = function(_) {\n return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n [ _[0], _[1], _[2] - 90 ]);\n };\n return rotate([ 0, 0, 90 ]);\n }).raw = d3_geo_transverseMercator;\n d3.geom = {};\n function d3_geom_pointX(d) {\n return d[0];\n }\n function d3_geom_pointY(d) {\n return d[1];\n }\n d3.geom.hull = function(vertices) {\n var x = d3_geom_pointX, y = d3_geom_pointY;\n if (arguments.length) return hull(vertices);\n function hull(data) {\n if (data.length < 3) return [];\n var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n for (i = 0; i < n; i++) {\n points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n }\n points.sort(d3_geom_hullOrder);\n for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n return polygon;\n }\n hull.x = function(_) {\n return arguments.length ? (x = _, hull) : x;\n };\n hull.y = function(_) {\n return arguments.length ? (y = _, hull) : y;\n };\n return hull;\n };\n function d3_geom_hullUpper(points) {\n var n = points.length, hull = [ 0, 1 ], hs = 2;\n for (var i = 2; i < n; i++) {\n while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n hull[hs++] = i;\n }\n return hull.slice(0, hs);\n }\n function d3_geom_hullOrder(a, b) {\n return a[0] - b[0] || a[1] - b[1];\n }\n d3.geom.polygon = function(coordinates) {\n d3_subclass(coordinates, d3_geom_polygonPrototype);\n return coordinates;\n };\n var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n d3_geom_polygonPrototype.area = function() {\n var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n while (++i < n) {\n a = b;\n b = this[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n return area * .5;\n };\n d3_geom_polygonPrototype.centroid = function(k) {\n var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n if (!arguments.length) k = -1 / (6 * this.area());\n while (++i < n) {\n a = b;\n b = this[i];\n c = a[0] * b[1] - b[0] * a[1];\n x += (a[0] + b[0]) * c;\n y += (a[1] + b[1]) * c;\n }\n return [ x * k, y * k ];\n };\n d3_geom_polygonPrototype.clip = function(subject) {\n var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n while (++i < n) {\n input = subject.slice();\n subject.length = 0;\n b = this[i];\n c = input[(m = input.length - closed) - 1];\n j = -1;\n while (++j < m) {\n d = input[j];\n if (d3_geom_polygonInside(d, a, b)) {\n if (!d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n subject.push(d);\n } else if (d3_geom_polygonInside(c, a, b)) {\n subject.push(d3_geom_polygonIntersect(c, d, a, b));\n }\n c = d;\n }\n if (closed) subject.push(subject[0]);\n a = b;\n }\n return subject;\n };\n function d3_geom_polygonInside(p, a, b) {\n return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n }\n function d3_geom_polygonIntersect(c, d, a, b) {\n var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n return [ x1 + ua * x21, y1 + ua * y21 ];\n }\n function d3_geom_polygonClosed(coordinates) {\n var a = coordinates[0], b = coordinates[coordinates.length - 1];\n return !(a[0] - b[0] || a[1] - b[1]);\n }\n var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n function d3_geom_voronoiBeach() {\n d3_geom_voronoiRedBlackNode(this);\n this.edge = this.site = this.circle = null;\n }\n function d3_geom_voronoiCreateBeach(site) {\n var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n beach.site = site;\n return beach;\n }\n function d3_geom_voronoiDetachBeach(beach) {\n d3_geom_voronoiDetachCircle(beach);\n d3_geom_voronoiBeaches.remove(beach);\n d3_geom_voronoiBeachPool.push(beach);\n d3_geom_voronoiRedBlackNode(beach);\n }\n function d3_geom_voronoiRemoveBeach(beach) {\n var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n x: x,\n y: y\n }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n d3_geom_voronoiDetachBeach(beach);\n var lArc = previous;\n while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n previous = lArc.P;\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachBeach(lArc);\n lArc = previous;\n }\n disappearing.unshift(lArc);\n d3_geom_voronoiDetachCircle(lArc);\n var rArc = next;\n while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n next = rArc.N;\n disappearing.push(rArc);\n d3_geom_voronoiDetachBeach(rArc);\n rArc = next;\n }\n disappearing.push(rArc);\n d3_geom_voronoiDetachCircle(rArc);\n var nArcs = disappearing.length, iArc;\n for (iArc = 1; iArc < nArcs; ++iArc) {\n rArc = disappearing[iArc];\n lArc = disappearing[iArc - 1];\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n }\n lArc = disappearing[0];\n rArc = disappearing[nArcs - 1];\n rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiAddBeach(site) {\n var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n while (node) {\n dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n if (dxl > ε) node = node.L; else {\n dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n if (dxr > ε) {\n if (!node.R) {\n lArc = node;\n break;\n }\n node = node.R;\n } else {\n if (dxl > -ε) {\n lArc = node.P;\n rArc = node;\n } else if (dxr > -ε) {\n lArc = node;\n rArc = node.N;\n } else {\n lArc = rArc = node;\n }\n break;\n }\n }\n }\n var newArc = d3_geom_voronoiCreateBeach(site);\n d3_geom_voronoiBeaches.insert(lArc, newArc);\n if (!lArc && !rArc) return;\n if (lArc === rArc) {\n d3_geom_voronoiDetachCircle(lArc);\n rArc = d3_geom_voronoiCreateBeach(lArc.site);\n d3_geom_voronoiBeaches.insert(newArc, rArc);\n newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n return;\n }\n if (!rArc) {\n newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n return;\n }\n d3_geom_voronoiDetachCircle(lArc);\n d3_geom_voronoiDetachCircle(rArc);\n var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n x: (cy * hb - by * hc) / d + ax,\n y: (bx * hc - cx * hb) / d + ay\n };\n d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n d3_geom_voronoiAttachCircle(lArc);\n d3_geom_voronoiAttachCircle(rArc);\n }\n function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n if (!pby2) return rfocx;\n var lArc = arc.P;\n if (!lArc) return -Infinity;\n site = lArc.site;\n var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n if (!plby2) return lfocx;\n var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n return (rfocx + lfocx) / 2;\n }\n function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n var rArc = arc.N;\n if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n var site = arc.site;\n return site.y === directrix ? site.x : Infinity;\n }\n function d3_geom_voronoiCell(site) {\n this.site = site;\n this.edges = [];\n }\n d3_geom_voronoiCell.prototype.prepare = function() {\n var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n while (iHalfEdge--) {\n edge = halfEdges[iHalfEdge].edge;\n if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n }\n halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n return halfEdges.length;\n };\n function d3_geom_voronoiCloseCells(extent) {\n var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n while (iCell--) {\n cell = cells[iCell];\n if (!cell || !cell.prepare()) continue;\n halfEdges = cell.edges;\n nHalfEdges = halfEdges.length;\n iHalfEdge = 0;\n while (iHalfEdge < nHalfEdges) {\n end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n x: x0,\n y: abs(x2 - x0) < ε ? y2 : y1\n } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n x: abs(y2 - y1) < ε ? x2 : x1,\n y: y1\n } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n x: x1,\n y: abs(x2 - x1) < ε ? y2 : y0\n } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n x: abs(y2 - y0) < ε ? x2 : x0,\n y: y0\n } : null), cell.site, null));\n ++nHalfEdges;\n }\n }\n }\n }\n function d3_geom_voronoiHalfEdgeOrder(a, b) {\n return b.angle - a.angle;\n }\n function d3_geom_voronoiCircle() {\n d3_geom_voronoiRedBlackNode(this);\n this.x = this.y = this.arc = this.site = this.cy = null;\n }\n function d3_geom_voronoiAttachCircle(arc) {\n var lArc = arc.P, rArc = arc.N;\n if (!lArc || !rArc) return;\n var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n if (lSite === rSite) return;\n var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n var d = 2 * (ax * cy - ay * cx);\n if (d >= -ε2) return;\n var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n circle.arc = arc;\n circle.site = cSite;\n circle.x = x + bx;\n circle.y = cy + Math.sqrt(x * x + y * y);\n circle.cy = cy;\n arc.circle = circle;\n var before = null, node = d3_geom_voronoiCircles._;\n while (node) {\n if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n if (node.L) node = node.L; else {\n before = node.P;\n break;\n }\n } else {\n if (node.R) node = node.R; else {\n before = node;\n break;\n }\n }\n }\n d3_geom_voronoiCircles.insert(before, circle);\n if (!before) d3_geom_voronoiFirstCircle = circle;\n }\n function d3_geom_voronoiDetachCircle(arc) {\n var circle = arc.circle;\n if (circle) {\n if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n d3_geom_voronoiCircles.remove(circle);\n d3_geom_voronoiCirclePool.push(circle);\n d3_geom_voronoiRedBlackNode(circle);\n arc.circle = null;\n }\n }\n function d3_geom_voronoiClipEdges(extent) {\n var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n while (i--) {\n e = edges[i];\n if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n e.a = e.b = null;\n edges.splice(i, 1);\n }\n }\n }\n function d3_geom_voronoiConnectEdge(edge, extent) {\n var vb = edge.b;\n if (vb) return true;\n var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n if (ry === ly) {\n if (fx < x0 || fx >= x1) return;\n if (lx > rx) {\n if (!va) va = {\n x: fx,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: fx,\n y: y1\n };\n } else {\n if (!va) va = {\n x: fx,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: fx,\n y: y0\n };\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 (!va) va = {\n x: (y0 - fb) / fm,\n y: y0\n }; else if (va.y >= y1) return;\n vb = {\n x: (y1 - fb) / fm,\n y: y1\n };\n } else {\n if (!va) va = {\n x: (y1 - fb) / fm,\n y: y1\n }; else if (va.y < y0) return;\n vb = {\n x: (y0 - fb) / fm,\n y: y0\n };\n }\n } else {\n if (ly < ry) {\n if (!va) va = {\n x: x0,\n y: fm * x0 + fb\n }; else if (va.x >= x1) return;\n vb = {\n x: x1,\n y: fm * x1 + fb\n };\n } else {\n if (!va) va = {\n x: x1,\n y: fm * x1 + fb\n }; else if (va.x < x0) return;\n vb = {\n x: x0,\n y: fm * x0 + fb\n };\n }\n }\n }\n edge.a = va;\n edge.b = vb;\n return true;\n }\n function d3_geom_voronoiEdge(lSite, rSite) {\n this.l = lSite;\n this.r = rSite;\n this.a = this.b = null;\n }\n function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, rSite);\n d3_geom_voronoiEdges.push(edge);\n if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n return edge;\n }\n function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n var edge = new d3_geom_voronoiEdge(lSite, null);\n edge.a = va;\n edge.b = vb;\n d3_geom_voronoiEdges.push(edge);\n return edge;\n }\n function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n if (!edge.a && !edge.b) {\n edge.a = vertex;\n edge.l = lSite;\n edge.r = rSite;\n } else if (edge.l === rSite) {\n edge.b = vertex;\n } else {\n edge.a = vertex;\n }\n }\n function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n var va = edge.a, vb = edge.b;\n this.edge = edge;\n this.site = lSite;\n this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n }\n d3_geom_voronoiHalfEdge.prototype = {\n start: function() {\n return this.edge.l === this.site ? this.edge.a : this.edge.b;\n },\n end: function() {\n return this.edge.l === this.site ? this.edge.b : this.edge.a;\n }\n };\n function d3_geom_voronoiRedBlackTree() {\n this._ = null;\n }\n function d3_geom_voronoiRedBlackNode(node) {\n node.U = node.C = node.L = node.R = node.P = node.N = null;\n }\n d3_geom_voronoiRedBlackTree.prototype = {\n insert: function(after, node) {\n var parent, grandpa, uncle;\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 = d3_geom_voronoiRedBlackFirst(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 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 d3_geom_voronoiRedBlackRotateLeft(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateRight(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 d3_geom_voronoiRedBlackRotateRight(this, parent);\n after = parent;\n parent = after.U;\n }\n parent.C = false;\n grandpa.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n }\n }\n parent = after.U;\n }\n this._.C = false;\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 var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n if (parent) {\n if (parent.L === node) parent.L = next; else parent.R = next;\n } else {\n this._ = next;\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 if (node) node.U = parent;\n if (red) return;\n if (node && node.C) {\n node.C = false;\n 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 d3_geom_voronoiRedBlackRotateLeft(this, parent);\n sibling = parent.R;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.R || !sibling.R.C) {\n sibling.L.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateRight(this, sibling);\n sibling = parent.R;\n }\n sibling.C = parent.C;\n parent.C = sibling.R.C = false;\n d3_geom_voronoiRedBlackRotateLeft(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 d3_geom_voronoiRedBlackRotateRight(this, parent);\n sibling = parent.L;\n }\n if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n if (!sibling.L || !sibling.L.C) {\n sibling.R.C = false;\n sibling.C = true;\n d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n sibling = parent.L;\n }\n sibling.C = parent.C;\n parent.C = sibling.L.C = false;\n d3_geom_voronoiRedBlackRotateRight(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 if (node) node.C = false;\n }\n };\n function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n var p = node, q = node.R, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\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 function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n var p = node, q = node.L, parent = p.U;\n if (parent) {\n if (parent.L === p) parent.L = q; else parent.R = q;\n } else {\n tree._ = q;\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 function d3_geom_voronoiRedBlackFirst(node) {\n while (node.L) node = node.L;\n return node;\n }\n function d3_geom_voronoi(sites, bbox) {\n var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n d3_geom_voronoiEdges = [];\n d3_geom_voronoiCells = new Array(sites.length);\n d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n while (true) {\n circle = d3_geom_voronoiFirstCircle;\n if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n if (site.x !== x0 || site.y !== y0) {\n d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n d3_geom_voronoiAddBeach(site);\n x0 = site.x, y0 = site.y;\n }\n site = sites.pop();\n } else if (circle) {\n d3_geom_voronoiRemoveBeach(circle.arc);\n } else {\n break;\n }\n }\n if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n var diagram = {\n cells: d3_geom_voronoiCells,\n edges: d3_geom_voronoiEdges\n };\n d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n return diagram;\n }\n function d3_geom_voronoiVertexOrder(a, b) {\n return b.y - a.y || b.x - a.x;\n }\n d3.geom.voronoi = function(points) {\n var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n if (points) return voronoi(points);\n function voronoi(data) {\n var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n var s = e.start();\n return [ s.x, s.y ];\n }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n polygon.point = data[i];\n });\n return polygons;\n }\n function sites(data) {\n return data.map(function(d, i) {\n return {\n x: Math.round(fx(d, i) / ε) * ε,\n y: Math.round(fy(d, i) / ε) * ε,\n i: i\n };\n });\n }\n voronoi.links = function(data) {\n return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n return edge.l && edge.r;\n }).map(function(edge) {\n return {\n source: data[edge.l.i],\n target: data[edge.r.i]\n };\n });\n };\n voronoi.triangles = function(data) {\n var triangles = [];\n d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n while (++j < m) {\n e0 = e1;\n s0 = s1;\n e1 = edges[j].edge;\n s1 = e1.l === site ? e1.r : e1.l;\n if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n }\n }\n });\n return triangles;\n };\n voronoi.x = function(_) {\n return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n };\n voronoi.y = function(_) {\n return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n };\n voronoi.clipExtent = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n return voronoi;\n };\n voronoi.size = function(_) {\n if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n };\n return voronoi;\n };\n var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n function d3_geom_voronoiTriangleArea(a, b, c) {\n return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n }\n d3.geom.delaunay = function(vertices) {\n return d3.geom.voronoi().triangles(vertices);\n };\n d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n if (compat = arguments.length) {\n x = d3_geom_quadtreeCompatX;\n y = d3_geom_quadtreeCompatY;\n if (compat === 3) {\n y2 = y1;\n x2 = x1;\n y1 = x1 = 0;\n }\n return quadtree(points);\n }\n function quadtree(data) {\n var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n if (x1 != null) {\n x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n } else {\n x2_ = y2_ = -(x1_ = y1_ = Infinity);\n xs = [], ys = [];\n n = data.length;\n if (compat) for (i = 0; i < n; ++i) {\n d = data[i];\n if (d.x < x1_) x1_ = d.x;\n if (d.y < y1_) y1_ = d.y;\n if (d.x > x2_) x2_ = d.x;\n if (d.y > y2_) y2_ = d.y;\n xs.push(d.x);\n ys.push(d.y);\n } else for (i = 0; i < n; ++i) {\n var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n if (x_ < x1_) x1_ = x_;\n if (y_ < y1_) y1_ = y_;\n if (x_ > x2_) x2_ = x_;\n if (y_ > y2_) y2_ = y_;\n xs.push(x_);\n ys.push(y_);\n }\n }\n var dx = x2_ - x1_, dy = y2_ - y1_;\n if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n function insert(n, d, x, y, x1, y1, x2, y2) {\n if (isNaN(x) || isNaN(y)) return;\n if (n.leaf) {\n var nx = n.x, ny = n.y;\n if (nx != null) {\n if (abs(nx - x) + abs(ny - y) < .01) {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n } else {\n var nPoint = n.point;\n n.x = n.y = n.point = null;\n insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n } else {\n n.x = x, n.y = y, n.point = d;\n }\n } else {\n insertChild(n, d, x, y, x1, y1, x2, y2);\n }\n }\n function insertChild(n, d, x, y, x1, y1, x2, y2) {\n var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n n.leaf = false;\n n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n if (right) x1 = xm; else x2 = xm;\n if (below) y1 = ym; else y2 = ym;\n insert(n, d, x, y, x1, y1, x2, y2);\n }\n var root = d3_geom_quadtreeNode();\n root.add = function(d) {\n insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n };\n root.visit = function(f) {\n d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n };\n root.find = function(point) {\n return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n };\n i = -1;\n if (x1 == null) {\n while (++i < n) {\n insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n }\n --i;\n } else data.forEach(root.add);\n xs = ys = data = d = null;\n return root;\n }\n quadtree.x = function(_) {\n return arguments.length ? (x = _, quadtree) : x;\n };\n quadtree.y = function(_) {\n return arguments.length ? (y = _, quadtree) : y;\n };\n quadtree.extent = function(_) {\n if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n y2 = +_[1][1];\n return quadtree;\n };\n quadtree.size = function(_) {\n if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n return quadtree;\n };\n return quadtree;\n };\n function d3_geom_quadtreeCompatX(d) {\n return d.x;\n }\n function d3_geom_quadtreeCompatY(d) {\n return d.y;\n }\n function d3_geom_quadtreeNode() {\n return {\n leaf: true,\n nodes: [],\n point: null,\n x: null,\n y: null\n };\n }\n function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n if (!f(node, x1, y1, x2, y2)) {\n var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n }\n }\n function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n var minDistance2 = Infinity, closestPoint;\n (function find(node, x1, y1, x2, y2) {\n if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n if (point = node.point) {\n var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n if (distance2 < minDistance2) {\n var distance = Math.sqrt(minDistance2 = distance2);\n x0 = x - distance, y0 = y - distance;\n x3 = x + distance, y3 = y + distance;\n closestPoint = point;\n }\n }\n var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n if (node = children[i & 3]) switch (i & 3) {\n case 0:\n find(node, x1, y1, xm, ym);\n break;\n\n case 1:\n find(node, xm, y1, x2, ym);\n break;\n\n case 2:\n find(node, x1, ym, xm, y2);\n break;\n\n case 3:\n find(node, xm, ym, x2, y2);\n break;\n }\n }\n })(root, x0, y0, x3, y3);\n return closestPoint;\n }\n d3.interpolateRgb = d3_interpolateRgb;\n function d3_interpolateRgb(a, b) {\n a = d3.rgb(a);\n b = d3.rgb(b);\n var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n return function(t) {\n return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n };\n }\n d3.interpolateObject = d3_interpolateObject;\n function d3_interpolateObject(a, b) {\n var i = {}, c = {}, k;\n for (k in a) {\n if (k in b) {\n i[k] = d3_interpolate(a[k], b[k]);\n } else {\n c[k] = a[k];\n }\n }\n for (k in b) {\n if (!(k in a)) {\n c[k] = b[k];\n }\n }\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n }\n d3.interpolateNumber = d3_interpolateNumber;\n function d3_interpolateNumber(a, b) {\n a = +a, b = +b;\n return function(t) {\n return a * (1 - t) + b * t;\n };\n }\n d3.interpolateString = d3_interpolateString;\n function d3_interpolateString(a, b) {\n var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n a = a + \"\", b = b + \"\";\n while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n if ((bs = bm.index) > bi) {\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) {\n if (s[i]) s[i] += bm; else s[++i] = bm;\n } else {\n s[++i] = null;\n q.push({\n i: i,\n x: d3_interpolateNumber(am, bm)\n });\n }\n bi = d3_interpolate_numberB.lastIndex;\n }\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; else s[++i] = bs;\n }\n return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n return b(t) + \"\";\n }) : function() {\n return 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 var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n d3.interpolate = d3_interpolate;\n function d3_interpolate(a, b) {\n var i = d3.interpolators.length, f;\n while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n return f;\n }\n d3.interpolators = [ function(a, b) {\n var t = typeof b;\n return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n } ];\n d3.interpolateArray = d3_interpolateArray;\n function d3_interpolateArray(a, b) {\n var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n for (;i < na; ++i) c[i] = a[i];\n for (;i < nb; ++i) c[i] = b[i];\n return function(t) {\n for (i = 0; i < n0; ++i) c[i] = x[i](t);\n return c;\n };\n }\n var d3_ease_default = function() {\n return d3_identity;\n };\n var d3_ease = d3.map({\n linear: d3_ease_default,\n poly: d3_ease_poly,\n quad: function() {\n return d3_ease_quad;\n },\n cubic: function() {\n return d3_ease_cubic;\n },\n sin: function() {\n return d3_ease_sin;\n },\n exp: function() {\n return d3_ease_exp;\n },\n circle: function() {\n return d3_ease_circle;\n },\n elastic: d3_ease_elastic,\n back: d3_ease_back,\n bounce: function() {\n return d3_ease_bounce;\n }\n });\n var d3_ease_mode = d3.map({\n \"in\": d3_identity,\n out: d3_ease_reverse,\n \"in-out\": d3_ease_reflect,\n \"out-in\": function(f) {\n return d3_ease_reflect(d3_ease_reverse(f));\n }\n });\n d3.ease = function(name) {\n var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n t = d3_ease.get(t) || d3_ease_default;\n m = d3_ease_mode.get(m) || d3_identity;\n return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n };\n function d3_ease_clamp(f) {\n return function(t) {\n return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n };\n }\n function d3_ease_reverse(f) {\n return function(t) {\n return 1 - f(1 - t);\n };\n }\n function d3_ease_reflect(f) {\n return function(t) {\n return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n };\n }\n function d3_ease_quad(t) {\n return t * t;\n }\n function d3_ease_cubic(t) {\n return t * t * t;\n }\n function d3_ease_cubicInOut(t) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n var t2 = t * t, t3 = t2 * t;\n return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n }\n function d3_ease_poly(e) {\n return function(t) {\n return Math.pow(t, e);\n };\n }\n function d3_ease_sin(t) {\n return 1 - Math.cos(t * halfπ);\n }\n function d3_ease_exp(t) {\n return Math.pow(2, 10 * (t - 1));\n }\n function d3_ease_circle(t) {\n return 1 - Math.sqrt(1 - t * t);\n }\n function d3_ease_elastic(a, p) {\n var s;\n if (arguments.length < 2) p = .45;\n if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n return function(t) {\n return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n };\n }\n function d3_ease_back(s) {\n if (!s) s = 1.70158;\n return function(t) {\n return t * t * ((s + 1) * t - s);\n };\n }\n function d3_ease_bounce(t) {\n return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n }\n d3.interpolateHcl = d3_interpolateHcl;\n function d3_interpolateHcl(a, b) {\n a = d3.hcl(a);\n b = d3.hcl(b);\n var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateHsl = d3_interpolateHsl;\n function d3_interpolateHsl(a, b) {\n a = d3.hsl(a);\n b = d3.hsl(b);\n var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n return function(t) {\n return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n };\n }\n d3.interpolateLab = d3_interpolateLab;\n function d3_interpolateLab(a, b) {\n a = d3.lab(a);\n b = d3.lab(b);\n var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n return function(t) {\n return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n };\n }\n d3.interpolateRound = d3_interpolateRound;\n function d3_interpolateRound(a, b) {\n b -= a;\n return function(t) {\n return Math.round(a + b * t);\n };\n }\n d3.transform = function(string) {\n var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n return (d3.transform = function(string) {\n if (string != null) {\n g.setAttribute(\"transform\", string);\n var t = g.transform.baseVal.consolidate();\n }\n return new d3_transform(t ? t.matrix : d3_transformIdentity);\n })(string);\n };\n function d3_transform(m) {\n var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n if (r0[0] * r1[1] < r1[0] * r0[1]) {\n r0[0] *= -1;\n r0[1] *= -1;\n kx *= -1;\n kz *= -1;\n }\n this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n this.translate = [ m.e, m.f ];\n this.scale = [ kx, ky ];\n this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n }\n d3_transform.prototype.toString = function() {\n return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n };\n function d3_transformDot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n }\n function d3_transformNormalize(a) {\n var k = Math.sqrt(d3_transformDot(a, a));\n if (k) {\n a[0] /= k;\n a[1] /= k;\n }\n return k;\n }\n function d3_transformCombine(a, b, k) {\n a[0] += k * b[0];\n a[1] += k * b[1];\n return a;\n }\n var d3_transformIdentity = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0\n };\n d3.interpolateTransform = d3_interpolateTransform;\n function d3_interpolateTransformPop(s) {\n return s.length ? s.pop() + \",\" : \"\";\n }\n function d3_interpolateTranslate(ta, tb, s, q) {\n if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n var i = s.push(\"translate(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ta[0], tb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ta[1], tb[1])\n });\n } else if (tb[0] || tb[1]) {\n s.push(\"translate(\" + tb + \")\");\n }\n }\n function d3_interpolateRotate(ra, rb, s, q) {\n if (ra !== rb) {\n if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n x: d3_interpolateNumber(ra, rb)\n });\n } else if (rb) {\n s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n }\n }\n function d3_interpolateSkew(wa, wb, s, q) {\n if (wa !== wb) {\n q.push({\n i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n x: d3_interpolateNumber(wa, wb)\n });\n } else if (wb) {\n s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n }\n }\n function d3_interpolateScale(ka, kb, s, q) {\n if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({\n i: i - 4,\n x: d3_interpolateNumber(ka[0], kb[0])\n }, {\n i: i - 2,\n x: d3_interpolateNumber(ka[1], kb[1])\n });\n } else if (kb[0] !== 1 || kb[1] !== 1) {\n s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n }\n }\n function d3_interpolateTransform(a, b) {\n var s = [], q = [];\n a = d3.transform(a), b = d3.transform(b);\n d3_interpolateTranslate(a.translate, b.translate, s, q);\n d3_interpolateRotate(a.rotate, b.rotate, s, q);\n d3_interpolateSkew(a.skew, b.skew, s, q);\n d3_interpolateScale(a.scale, b.scale, s, q);\n a = b = null;\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 function d3_uninterpolateNumber(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return (x - a) / b;\n };\n }\n function d3_uninterpolateClamp(a, b) {\n b = (b -= a = +a) || 1 / b;\n return function(x) {\n return Math.max(0, Math.min(1, (x - a) / b));\n };\n }\n d3.layout = {};\n d3.layout.bundle = function() {\n return function(links) {\n var paths = [], i = -1, n = links.length;\n while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n return paths;\n };\n };\n function d3_layout_bundlePath(link) {\n var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n while (start !== lca) {\n start = start.parent;\n points.push(start);\n }\n var k = points.length;\n while (end !== lca) {\n points.splice(k, 0, end);\n end = end.parent;\n }\n return points;\n }\n function d3_layout_bundleAncestors(node) {\n var ancestors = [], parent = node.parent;\n while (parent != null) {\n ancestors.push(node);\n node = parent;\n parent = parent.parent;\n }\n ancestors.push(node);\n return ancestors;\n }\n function d3_layout_bundleLeastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n while (aNode === bNode) {\n sharedNode = aNode;\n aNode = aNodes.pop();\n bNode = bNodes.pop();\n }\n return sharedNode;\n }\n d3.layout.chord = function() {\n var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n function relayout() {\n var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n chords = [];\n groups = [];\n k = 0, i = -1;\n while (++i < n) {\n x = 0, j = -1;\n while (++j < n) {\n x += matrix[i][j];\n }\n groupSums.push(x);\n subgroupIndex.push(d3.range(n));\n k += x;\n }\n if (sortGroups) {\n groupIndex.sort(function(a, b) {\n return sortGroups(groupSums[a], groupSums[b]);\n });\n }\n if (sortSubgroups) {\n subgroupIndex.forEach(function(d, i) {\n d.sort(function(a, b) {\n return sortSubgroups(matrix[i][a], matrix[i][b]);\n });\n });\n }\n k = (τ - padding * n) / k;\n x = 0, i = -1;\n while (++i < n) {\n x0 = x, j = -1;\n while (++j < n) {\n var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n subgroups[di + \"-\" + dj] = {\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 += padding;\n }\n i = -1;\n while (++i < n) {\n j = i - 1;\n while (++j < n) {\n var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n if (source.value || target.value) {\n chords.push(source.value < target.value ? {\n source: target,\n target: source\n } : {\n source: source,\n target: target\n });\n }\n }\n }\n if (sortChords) resort();\n }\n function resort() {\n chords.sort(function(a, b) {\n return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n });\n }\n chord.matrix = function(x) {\n if (!arguments.length) return matrix;\n n = (matrix = x) && matrix.length;\n chords = groups = null;\n return chord;\n };\n chord.padding = function(x) {\n if (!arguments.length) return padding;\n padding = x;\n chords = groups = null;\n return chord;\n };\n chord.sortGroups = function(x) {\n if (!arguments.length) return sortGroups;\n sortGroups = x;\n chords = groups = null;\n return chord;\n };\n chord.sortSubgroups = function(x) {\n if (!arguments.length) return sortSubgroups;\n sortSubgroups = x;\n chords = null;\n return chord;\n };\n chord.sortChords = function(x) {\n if (!arguments.length) return sortChords;\n sortChords = x;\n if (chords) resort();\n return chord;\n };\n chord.chords = function() {\n if (!chords) relayout();\n return chords;\n };\n chord.groups = function() {\n if (!groups) relayout();\n return groups;\n };\n return chord;\n };\n d3.layout.force = function() {\n var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n function repulse(node) {\n return function(quad, x1, _, x2) {\n if (quad.point !== node) {\n var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n if (dw * dw / theta2 < dn) {\n if (dn < chargeDistance2) {\n var k = quad.charge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n return true;\n }\n if (quad.point && dn && dn < chargeDistance2) {\n var k = quad.pointCharge / dn;\n node.px -= dx * k;\n node.py -= dy * k;\n }\n }\n return !quad.charge;\n };\n }\n force.tick = function() {\n if ((alpha *= .99) < .005) {\n timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n return true;\n }\n var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n for (i = 0; i < m; ++i) {\n o = links[i];\n s = o.source;\n t = o.target;\n x = t.x - s.x;\n y = t.y - s.y;\n if (l = x * x + y * y) {\n l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n x *= l;\n y *= l;\n t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n t.y -= y * k;\n s.x += x * (k = 1 - k);\n s.y += y * k;\n }\n }\n if (k = alpha * gravity) {\n x = size[0] / 2;\n y = size[1] / 2;\n i = -1;\n if (k) while (++i < n) {\n o = nodes[i];\n o.x += (x - o.x) * k;\n o.y += (y - o.y) * k;\n }\n }\n if (charge) {\n d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n i = -1;\n while (++i < n) {\n if (!(o = nodes[i]).fixed) {\n q.visit(repulse(o));\n }\n }\n }\n i = -1;\n while (++i < n) {\n o = nodes[i];\n if (o.fixed) {\n o.x = o.px;\n o.y = o.py;\n } else {\n o.x -= (o.px - (o.px = o.x)) * friction;\n o.y -= (o.py - (o.py = o.y)) * friction;\n }\n }\n event.tick({\n type: \"tick\",\n alpha: alpha\n });\n };\n force.nodes = function(x) {\n if (!arguments.length) return nodes;\n nodes = x;\n return force;\n };\n force.links = function(x) {\n if (!arguments.length) return links;\n links = x;\n return force;\n };\n force.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return force;\n };\n force.linkDistance = function(x) {\n if (!arguments.length) return linkDistance;\n linkDistance = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.distance = force.linkDistance;\n force.linkStrength = function(x) {\n if (!arguments.length) return linkStrength;\n linkStrength = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.friction = function(x) {\n if (!arguments.length) return friction;\n friction = +x;\n return force;\n };\n force.charge = function(x) {\n if (!arguments.length) return charge;\n charge = typeof x === \"function\" ? x : +x;\n return force;\n };\n force.chargeDistance = function(x) {\n if (!arguments.length) return Math.sqrt(chargeDistance2);\n chargeDistance2 = x * x;\n return force;\n };\n force.gravity = function(x) {\n if (!arguments.length) return gravity;\n gravity = +x;\n return force;\n };\n force.theta = function(x) {\n if (!arguments.length) return Math.sqrt(theta2);\n theta2 = x * x;\n return force;\n };\n force.alpha = function(x) {\n if (!arguments.length) return alpha;\n x = +x;\n if (alpha) {\n if (x > 0) {\n alpha = x;\n } else {\n timer.c = null, timer.t = NaN, timer = null;\n event.end({\n type: \"end\",\n alpha: alpha = 0\n });\n }\n } else if (x > 0) {\n event.start({\n type: \"start\",\n alpha: alpha = x\n });\n timer = d3_timer(force.tick);\n }\n return force;\n };\n force.start = function() {\n var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n for (i = 0; i < n; ++i) {\n (o = nodes[i]).index = i;\n o.weight = 0;\n }\n for (i = 0; i < m; ++i) {\n o = links[i];\n if (typeof o.source == \"number\") o.source = nodes[o.source];\n if (typeof o.target == \"number\") o.target = nodes[o.target];\n ++o.source.weight;\n ++o.target.weight;\n }\n for (i = 0; i < n; ++i) {\n o = nodes[i];\n if (isNaN(o.x)) o.x = position(\"x\", w);\n if (isNaN(o.y)) o.y = position(\"y\", h);\n if (isNaN(o.px)) o.px = o.x;\n if (isNaN(o.py)) o.py = o.y;\n }\n distances = [];\n if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n strengths = [];\n if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n charges = [];\n if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n function position(dimension, size) {\n if (!neighbors) {\n neighbors = new Array(n);\n for (j = 0; j < n; ++j) {\n neighbors[j] = [];\n }\n for (j = 0; j < m; ++j) {\n var o = links[j];\n neighbors[o.source.index].push(o.target);\n neighbors[o.target.index].push(o.source);\n }\n }\n var candidates = neighbors[i], j = -1, l = candidates.length, x;\n while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n return Math.random() * size;\n }\n return force.resume();\n };\n force.resume = function() {\n return force.alpha(.1);\n };\n force.stop = function() {\n return force.alpha(0);\n };\n force.drag = function() {\n if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n if (!arguments.length) return drag;\n this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n };\n function dragmove(d) {\n d.px = d3.event.x, d.py = d3.event.y;\n force.resume();\n }\n return d3.rebind(force, event, \"on\");\n };\n function d3_layout_forceDragstart(d) {\n d.fixed |= 2;\n }\n function d3_layout_forceDragend(d) {\n d.fixed &= ~6;\n }\n function d3_layout_forceMouseover(d) {\n d.fixed |= 4;\n d.px = d.x, d.py = d.y;\n }\n function d3_layout_forceMouseout(d) {\n d.fixed &= ~4;\n }\n function d3_layout_forceAccumulate(quad, alpha, charges) {\n var cx = 0, cy = 0;\n quad.charge = 0;\n if (!quad.leaf) {\n var nodes = quad.nodes, n = nodes.length, i = -1, c;\n while (++i < n) {\n c = nodes[i];\n if (c == null) continue;\n d3_layout_forceAccumulate(c, alpha, charges);\n quad.charge += c.charge;\n cx += c.charge * c.cx;\n cy += c.charge * c.cy;\n }\n }\n if (quad.point) {\n if (!quad.leaf) {\n quad.point.x += Math.random() - .5;\n quad.point.y += Math.random() - .5;\n }\n var k = alpha * charges[quad.point.index];\n quad.charge += quad.pointCharge = k;\n cx += k * quad.point.x;\n cy += k * quad.point.y;\n }\n quad.cx = cx / quad.charge;\n quad.cy = cy / quad.charge;\n }\n var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n d3.layout.hierarchy = function() {\n var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n function hierarchy(root) {\n var stack = [ root ], nodes = [], node;\n root.depth = 0;\n while ((node = stack.pop()) != null) {\n nodes.push(node);\n if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n var n, childs, child;\n while (--n >= 0) {\n stack.push(child = childs[n]);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n if (value) node.value = 0;\n node.children = childs;\n } else {\n if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n delete node.children;\n }\n }\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var childs, parent;\n if (sort && (childs = node.children)) childs.sort(sort);\n if (value && (parent = node.parent)) parent.value += node.value;\n });\n return nodes;\n }\n hierarchy.sort = function(x) {\n if (!arguments.length) return sort;\n sort = x;\n return hierarchy;\n };\n hierarchy.children = function(x) {\n if (!arguments.length) return children;\n children = x;\n return hierarchy;\n };\n hierarchy.value = function(x) {\n if (!arguments.length) return value;\n value = x;\n return hierarchy;\n };\n hierarchy.revalue = function(root) {\n if (value) {\n d3_layout_hierarchyVisitBefore(root, function(node) {\n if (node.children) node.value = 0;\n });\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var parent;\n if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n if (parent = node.parent) parent.value += node.value;\n });\n }\n return root;\n };\n return hierarchy;\n };\n function d3_layout_hierarchyRebind(object, hierarchy) {\n d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n object.nodes = object;\n object.links = d3_layout_hierarchyLinks;\n return object;\n }\n function d3_layout_hierarchyVisitBefore(node, callback) {\n var nodes = [ node ];\n while ((node = nodes.pop()) != null) {\n callback(node);\n if ((children = node.children) && (n = children.length)) {\n var n, children;\n while (--n >= 0) nodes.push(children[n]);\n }\n }\n }\n function d3_layout_hierarchyVisitAfter(node, callback) {\n var nodes = [ node ], nodes2 = [];\n while ((node = nodes.pop()) != null) {\n nodes2.push(node);\n if ((children = node.children) && (n = children.length)) {\n var i = -1, n, children;\n while (++i < n) nodes.push(children[i]);\n }\n }\n while ((node = nodes2.pop()) != null) {\n callback(node);\n }\n }\n function d3_layout_hierarchyChildren(d) {\n return d.children;\n }\n function d3_layout_hierarchyValue(d) {\n return d.value;\n }\n function d3_layout_hierarchySort(a, b) {\n return b.value - a.value;\n }\n function d3_layout_hierarchyLinks(nodes) {\n return d3.merge(nodes.map(function(parent) {\n return (parent.children || []).map(function(child) {\n return {\n source: parent,\n target: child\n };\n });\n }));\n }\n d3.layout.partition = function() {\n var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n function position(node, x, dx, dy) {\n var children = node.children;\n node.x = x;\n node.y = node.depth * dy;\n node.dx = dx;\n node.dy = dy;\n if (children && (n = children.length)) {\n var i = -1, n, c, d;\n dx = node.value ? dx / node.value : 0;\n while (++i < n) {\n position(c = children[i], x, d = c.value * dx, dy);\n x += d;\n }\n }\n }\n function depth(node) {\n var children = node.children, d = 0;\n if (children && (n = children.length)) {\n var i = -1, n;\n while (++i < n) d = Math.max(d, depth(children[i]));\n }\n return 1 + d;\n }\n function partition(d, i) {\n var nodes = hierarchy.call(this, d, i);\n position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n return nodes;\n }\n partition.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return partition;\n };\n return d3_layout_hierarchyRebind(partition, hierarchy);\n };\n d3.layout.pie = function() {\n var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n function pie(data) {\n var n = data.length, values = data.map(function(d, i) {\n return +value.call(pie, d, i);\n }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n return values[j] - values[i];\n } : function(i, j) {\n return sort(data[i], data[j]);\n });\n index.forEach(function(i) {\n arcs[i] = {\n data: data[i],\n value: v = values[i],\n startAngle: a,\n endAngle: a += v * k + pa,\n padAngle: p\n };\n });\n return arcs;\n }\n pie.value = function(_) {\n if (!arguments.length) return value;\n value = _;\n return pie;\n };\n pie.sort = function(_) {\n if (!arguments.length) return sort;\n sort = _;\n return pie;\n };\n pie.startAngle = function(_) {\n if (!arguments.length) return startAngle;\n startAngle = _;\n return pie;\n };\n pie.endAngle = function(_) {\n if (!arguments.length) return endAngle;\n endAngle = _;\n return pie;\n };\n pie.padAngle = function(_) {\n if (!arguments.length) return padAngle;\n padAngle = _;\n return pie;\n };\n return pie;\n };\n var d3_layout_pieSortByValue = {};\n d3.layout.stack = function() {\n var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n function stack(data, index) {\n if (!(n = data.length)) return data;\n var series = data.map(function(d, i) {\n return values.call(stack, d, i);\n });\n var points = series.map(function(d) {\n return d.map(function(v, i) {\n return [ x.call(stack, v, i), y.call(stack, v, i) ];\n });\n });\n var orders = order.call(stack, points, index);\n series = d3.permute(series, orders);\n points = d3.permute(points, orders);\n var offsets = offset.call(stack, points, index);\n var m = series[0].length, n, i, j, o;\n for (j = 0; j < m; ++j) {\n out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n for (i = 1; i < n; ++i) {\n out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n }\n }\n return data;\n }\n stack.values = function(x) {\n if (!arguments.length) return values;\n values = x;\n return stack;\n };\n stack.order = function(x) {\n if (!arguments.length) return order;\n order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n return stack;\n };\n stack.offset = function(x) {\n if (!arguments.length) return offset;\n offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n return stack;\n };\n stack.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n return stack;\n };\n stack.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n return stack;\n };\n stack.out = function(z) {\n if (!arguments.length) return out;\n out = z;\n return stack;\n };\n return stack;\n };\n function d3_layout_stackX(d) {\n return d.x;\n }\n function d3_layout_stackY(d) {\n return d.y;\n }\n function d3_layout_stackOut(d, y0, y) {\n d.y0 = y0;\n d.y = y;\n }\n var d3_layout_stackOrders = d3.map({\n \"inside-out\": function(data) {\n var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n return max[a] - max[b];\n }), top = 0, bottom = 0, tops = [], bottoms = [];\n for (i = 0; i < n; ++i) {\n j = index[i];\n if (top < bottom) {\n top += sums[j];\n tops.push(j);\n } else {\n bottom += sums[j];\n bottoms.push(j);\n }\n }\n return bottoms.reverse().concat(tops);\n },\n reverse: function(data) {\n return d3.range(data.length).reverse();\n },\n \"default\": d3_layout_stackOrderDefault\n });\n var d3_layout_stackOffsets = d3.map({\n silhouette: function(data) {\n var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o > max) max = o;\n sums.push(o);\n }\n for (j = 0; j < m; ++j) {\n y0[j] = (max - sums[j]) / 2;\n }\n return y0;\n },\n wiggle: function(data) {\n var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n y0[0] = o = o0 = 0;\n for (j = 1; j < m; ++j) {\n for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n }\n s2 += s3 * data[i][j][1];\n }\n y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n if (o < o0) o0 = o;\n }\n for (j = 0; j < m; ++j) y0[j] -= o0;\n return y0;\n },\n expand: function(data) {\n var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n for (j = 0; j < m; ++j) {\n for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n }\n for (j = 0; j < m; ++j) y0[j] = 0;\n return y0;\n },\n zero: d3_layout_stackOffsetZero\n });\n function d3_layout_stackOrderDefault(data) {\n return d3.range(data.length);\n }\n function d3_layout_stackOffsetZero(data) {\n var j = -1, m = data[0].length, y0 = [];\n while (++j < m) y0[j] = 0;\n return y0;\n }\n function d3_layout_stackMaxIndex(array) {\n var i = 1, j = 0, v = array[0][1], k, n = array.length;\n for (;i < n; ++i) {\n if ((k = array[i][1]) > v) {\n j = i;\n v = k;\n }\n }\n return j;\n }\n function d3_layout_stackReduceSum(d) {\n return d.reduce(d3_layout_stackSum, 0);\n }\n function d3_layout_stackSum(p, d) {\n return p + d[1];\n }\n d3.layout.histogram = function() {\n var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n function histogram(data, i) {\n var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n while (++i < m) {\n bin = bins[i] = [];\n bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n bin.y = 0;\n }\n if (m > 0) {\n i = -1;\n while (++i < n) {\n x = values[i];\n if (x >= range[0] && x <= range[1]) {\n bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n bin.y += k;\n bin.push(data[i]);\n }\n }\n }\n return bins;\n }\n histogram.value = function(x) {\n if (!arguments.length) return valuer;\n valuer = x;\n return histogram;\n };\n histogram.range = function(x) {\n if (!arguments.length) return ranger;\n ranger = d3_functor(x);\n return histogram;\n };\n histogram.bins = function(x) {\n if (!arguments.length) return binner;\n binner = typeof x === \"number\" ? function(range) {\n return d3_layout_histogramBinFixed(range, x);\n } : d3_functor(x);\n return histogram;\n };\n histogram.frequency = function(x) {\n if (!arguments.length) return frequency;\n frequency = !!x;\n return histogram;\n };\n return histogram;\n };\n function d3_layout_histogramBinSturges(range, values) {\n return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n }\n function d3_layout_histogramBinFixed(range, n) {\n var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n while (++x <= n) f[x] = m * x + b;\n return f;\n }\n function d3_layout_histogramRange(values) {\n return [ d3.min(values), d3.max(values) ];\n }\n d3.layout.pack = function() {\n var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n function pack(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n return radius;\n };\n root.x = root.y = 0;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r = +r(d.value);\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n if (padding) {\n var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r += dr;\n });\n d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n d3_layout_hierarchyVisitAfter(root, function(d) {\n d.r -= dr;\n });\n }\n d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n return nodes;\n }\n pack.size = function(_) {\n if (!arguments.length) return size;\n size = _;\n return pack;\n };\n pack.radius = function(_) {\n if (!arguments.length) return radius;\n radius = _ == null || typeof _ === \"function\" ? _ : +_;\n return pack;\n };\n pack.padding = function(_) {\n if (!arguments.length) return padding;\n padding = +_;\n return pack;\n };\n return d3_layout_hierarchyRebind(pack, hierarchy);\n };\n function d3_layout_packSort(a, b) {\n return a.value - b.value;\n }\n function d3_layout_packInsert(a, b) {\n var c = a._pack_next;\n a._pack_next = b;\n b._pack_prev = a;\n b._pack_next = c;\n c._pack_prev = b;\n }\n function d3_layout_packSplice(a, b) {\n a._pack_next = b;\n b._pack_prev = a;\n }\n function d3_layout_packIntersects(a, b) {\n var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n return .999 * dr * dr > dx * dx + dy * dy;\n }\n function d3_layout_packSiblings(node) {\n if (!(nodes = node.children) || !(n = nodes.length)) return;\n var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n function bound(node) {\n xMin = Math.min(node.x - node.r, xMin);\n xMax = Math.max(node.x + node.r, xMax);\n yMin = Math.min(node.y - node.r, yMin);\n yMax = Math.max(node.y + node.r, yMax);\n }\n nodes.forEach(d3_layout_packLink);\n a = nodes[0];\n a.x = -a.r;\n a.y = 0;\n bound(a);\n if (n > 1) {\n b = nodes[1];\n b.x = b.r;\n b.y = 0;\n bound(b);\n if (n > 2) {\n c = nodes[2];\n d3_layout_packPlace(a, b, c);\n bound(c);\n d3_layout_packInsert(a, c);\n a._pack_prev = c;\n d3_layout_packInsert(c, b);\n b = a._pack_next;\n for (i = 3; i < n; i++) {\n d3_layout_packPlace(a, b, c = nodes[i]);\n var isect = 0, s1 = 1, s2 = 1;\n for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n if (d3_layout_packIntersects(j, c)) {\n isect = 1;\n break;\n }\n }\n if (isect == 1) {\n for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n if (d3_layout_packIntersects(k, c)) {\n break;\n }\n }\n }\n if (isect) {\n if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n i--;\n } else {\n d3_layout_packInsert(a, c);\n b = c;\n bound(c);\n }\n }\n }\n }\n var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n for (i = 0; i < n; i++) {\n c = nodes[i];\n c.x -= cx;\n c.y -= cy;\n cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n }\n node.r = cr;\n nodes.forEach(d3_layout_packUnlink);\n }\n function d3_layout_packLink(node) {\n node._pack_next = node._pack_prev = node;\n }\n function d3_layout_packUnlink(node) {\n delete node._pack_next;\n delete node._pack_prev;\n }\n function d3_layout_packTransform(node, x, y, k) {\n var children = node.children;\n node.x = x += k * node.x;\n node.y = y += k * node.y;\n node.r *= k;\n if (children) {\n var i = -1, n = children.length;\n while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n }\n }\n function d3_layout_packPlace(a, b, c) {\n var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n if (db && (dx || dy)) {\n var da = b.r + c.r, dc = dx * dx + dy * dy;\n da *= da;\n db *= db;\n var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n c.x = a.x + x * dx + y * dy;\n c.y = a.y + x * dy - y * dx;\n } else {\n c.x = a.x + db;\n c.y = a.y;\n }\n }\n d3.layout.tree = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n function tree(d, i) {\n var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n d3_layout_hierarchyVisitBefore(root1, secondWalk);\n if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n var left = root0, right = root0, bottom = root0;\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n if (node.x < left.x) left = node;\n if (node.x > right.x) right = node;\n if (node.depth > bottom.depth) bottom = node;\n });\n var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n d3_layout_hierarchyVisitBefore(root0, function(node) {\n node.x = (node.x + tx) * kx;\n node.y = node.depth * ky;\n });\n }\n return nodes;\n }\n function wrapTree(root0) {\n var root1 = {\n A: null,\n children: [ root0 ]\n }, queue = [ root1 ], node1;\n while ((node1 = queue.pop()) != null) {\n for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n queue.push((children[i] = child = {\n _: children[i],\n parent: node1,\n children: (child = children[i].children) && child.slice() || [],\n A: null,\n a: null,\n z: 0,\n m: 0,\n c: 0,\n s: 0,\n t: null,\n i: i\n }).a = child);\n }\n }\n return root1.children[0];\n }\n function firstWalk(v) {\n var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n if (children.length) {\n d3_layout_treeShift(v);\n var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n if (w) {\n v.z = w.z + separation(v._, w._);\n v.m = v.z - midpoint;\n } else {\n v.z = midpoint;\n }\n } else if (w) {\n v.z = w.z + separation(v._, w._);\n }\n v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n }\n function secondWalk(v) {\n v._.x = v.z + v.parent.m;\n v.m += v.parent.m;\n }\n function apportion(v, w, ancestor) {\n if (w) {\n var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n vom = d3_layout_treeLeft(vom);\n vop = d3_layout_treeRight(vop);\n vop.a = v;\n shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n if (shift > 0) {\n d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n sip += shift;\n sop += shift;\n }\n sim += vim.m;\n sip += vip.m;\n som += vom.m;\n sop += vop.m;\n }\n if (vim && !d3_layout_treeRight(vop)) {\n vop.t = vim;\n vop.m += sim - sop;\n }\n if (vip && !d3_layout_treeLeft(vom)) {\n vom.t = vip;\n vom.m += sip - som;\n ancestor = v;\n }\n }\n return ancestor;\n }\n function sizeNode(node) {\n node.x *= size[0];\n node.y = node.depth * size[1];\n }\n tree.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return tree;\n };\n tree.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null ? sizeNode : null;\n return tree;\n };\n tree.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) == null ? null : sizeNode;\n return tree;\n };\n return d3_layout_hierarchyRebind(tree, hierarchy);\n };\n function d3_layout_treeSeparation(a, b) {\n return a.parent == b.parent ? 1 : 2;\n }\n function d3_layout_treeLeft(v) {\n var children = v.children;\n return children.length ? children[0] : v.t;\n }\n function d3_layout_treeRight(v) {\n var children = v.children, n;\n return (n = children.length) ? children[n - 1] : v.t;\n }\n function d3_layout_treeMove(wm, wp, shift) {\n var change = shift / (wp.i - wm.i);\n wp.c -= change;\n wp.s += shift;\n wm.c += change;\n wp.z += shift;\n wp.m += shift;\n }\n function d3_layout_treeShift(v) {\n var shift = 0, change = 0, children = v.children, i = children.length, w;\n while (--i >= 0) {\n w = children[i];\n w.z += shift;\n w.m += shift;\n shift += w.s + (change += w.c);\n }\n }\n function d3_layout_treeAncestor(vim, v, ancestor) {\n return vim.a.parent === v.parent ? vim.a : ancestor;\n }\n d3.layout.cluster = function() {\n var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n function cluster(d, i) {\n var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n d3_layout_hierarchyVisitAfter(root, function(node) {\n var children = node.children;\n if (children && children.length) {\n node.x = d3_layout_clusterX(children);\n node.y = d3_layout_clusterY(children);\n } else {\n node.x = previousNode ? x += separation(node, previousNode) : 0;\n node.y = 0;\n previousNode = node;\n }\n });\n var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n node.x = (node.x - root.x) * size[0];\n node.y = (root.y - node.y) * size[1];\n } : function(node) {\n node.x = (node.x - x0) / (x1 - x0) * size[0];\n node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n });\n return nodes;\n }\n cluster.separation = function(x) {\n if (!arguments.length) return separation;\n separation = x;\n return cluster;\n };\n cluster.size = function(x) {\n if (!arguments.length) return nodeSize ? null : size;\n nodeSize = (size = x) == null;\n return cluster;\n };\n cluster.nodeSize = function(x) {\n if (!arguments.length) return nodeSize ? size : null;\n nodeSize = (size = x) != null;\n return cluster;\n };\n return d3_layout_hierarchyRebind(cluster, hierarchy);\n };\n function d3_layout_clusterY(children) {\n return 1 + d3.max(children, function(child) {\n return child.y;\n });\n }\n function d3_layout_clusterX(children) {\n return children.reduce(function(x, child) {\n return x + child.x;\n }, 0) / children.length;\n }\n function d3_layout_clusterLeft(node) {\n var children = node.children;\n return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n }\n function d3_layout_clusterRight(node) {\n var children = node.children, n;\n return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n }\n d3.layout.treemap = function() {\n var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n function scale(children, k) {\n var i = -1, n = children.length, child, area;\n while (++i < n) {\n area = (child = children[i]).value * (k < 0 ? 0 : k);\n child.area = isNaN(area) || area <= 0 ? 0 : area;\n }\n }\n function squarify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while ((n = remaining.length) > 0) {\n row.push(child = remaining[n - 1]);\n row.area += child.area;\n if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n remaining.pop();\n best = score;\n } else {\n row.area -= row.pop().area;\n position(row, u, rect, false);\n u = Math.min(rect.dx, rect.dy);\n row.length = row.area = 0;\n best = Infinity;\n }\n }\n if (row.length) {\n position(row, u, rect, true);\n row.length = row.area = 0;\n }\n children.forEach(squarify);\n }\n }\n function stickify(node) {\n var children = node.children;\n if (children && children.length) {\n var rect = pad(node), remaining = children.slice(), child, row = [];\n scale(remaining, rect.dx * rect.dy / node.value);\n row.area = 0;\n while (child = remaining.pop()) {\n row.push(child);\n row.area += child.area;\n if (child.z != null) {\n position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n row.length = row.area = 0;\n }\n }\n children.forEach(stickify);\n }\n }\n function worst(row, u) {\n var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n while (++i < n) {\n if (!(r = row[i].area)) continue;\n if (r < rmin) rmin = r;\n if (r > rmax) rmax = r;\n }\n s *= s;\n u *= u;\n return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n }\n function position(row, u, rect, flush) {\n var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n if (u == rect.dx) {\n if (flush || v > rect.dy) v = rect.dy;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dy = v;\n x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n }\n o.z = true;\n o.dx += rect.x + rect.dx - x;\n rect.y += v;\n rect.dy -= v;\n } else {\n if (flush || v > rect.dx) v = rect.dx;\n while (++i < n) {\n o = row[i];\n o.x = x;\n o.y = y;\n o.dx = v;\n y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n }\n o.z = false;\n o.dy += rect.y + rect.dy - y;\n rect.x += v;\n rect.dx -= v;\n }\n }\n function treemap(d) {\n var nodes = stickies || hierarchy(d), root = nodes[0];\n root.x = root.y = 0;\n if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n if (stickies) hierarchy.revalue(root);\n scale([ root ], root.dx * root.dy / root.value);\n (stickies ? stickify : squarify)(root);\n if (sticky) stickies = nodes;\n return nodes;\n }\n treemap.size = function(x) {\n if (!arguments.length) return size;\n size = x;\n return treemap;\n };\n treemap.padding = function(x) {\n if (!arguments.length) return padding;\n function padFunction(node) {\n var p = x.call(treemap, node, node.depth);\n return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n }\n function padConstant(node) {\n return d3_layout_treemapPad(node, x);\n }\n var type;\n pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n padConstant) : padConstant;\n return treemap;\n };\n treemap.round = function(x) {\n if (!arguments.length) return round != Number;\n round = x ? Math.round : Number;\n return treemap;\n };\n treemap.sticky = function(x) {\n if (!arguments.length) return sticky;\n sticky = x;\n stickies = null;\n return treemap;\n };\n treemap.ratio = function(x) {\n if (!arguments.length) return ratio;\n ratio = x;\n return treemap;\n };\n treemap.mode = function(x) {\n if (!arguments.length) return mode;\n mode = x + \"\";\n return treemap;\n };\n return d3_layout_hierarchyRebind(treemap, hierarchy);\n };\n function d3_layout_treemapPadNull(node) {\n return {\n x: node.x,\n y: node.y,\n dx: node.dx,\n dy: node.dy\n };\n }\n function d3_layout_treemapPad(node, padding) {\n var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n if (dx < 0) {\n x += dx / 2;\n dx = 0;\n }\n if (dy < 0) {\n y += dy / 2;\n dy = 0;\n }\n return {\n x: x,\n y: y,\n dx: dx,\n dy: dy\n };\n }\n d3.random = {\n normal: function(µ, σ) {\n var n = arguments.length;\n if (n < 2) σ = 1;\n if (n < 1) µ = 0;\n return function() {\n var x, y, r;\n do {\n x = Math.random() * 2 - 1;\n y = Math.random() * 2 - 1;\n r = x * x + y * y;\n } while (!r || r > 1);\n return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n };\n },\n logNormal: function() {\n var random = d3.random.normal.apply(d3, arguments);\n return function() {\n return Math.exp(random());\n };\n },\n bates: function(m) {\n var random = d3.random.irwinHall(m);\n return function() {\n return random() / m;\n };\n },\n irwinHall: function(m) {\n return function() {\n for (var s = 0, j = 0; j < m; j++) s += Math.random();\n return s;\n };\n }\n };\n d3.scale = {};\n function d3_scaleExtent(domain) {\n var start = domain[0], stop = domain[domain.length - 1];\n return start < stop ? [ start, stop ] : [ stop, start ];\n }\n function d3_scaleRange(scale) {\n return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n }\n function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n return function(x) {\n return i(u(x));\n };\n }\n function d3_scale_nice(domain, nice) {\n var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n if (x1 < x0) {\n dx = i0, i0 = i1, i1 = dx;\n dx = x0, x0 = x1, x1 = dx;\n }\n domain[i0] = nice.floor(x0);\n domain[i1] = nice.ceil(x1);\n return domain;\n }\n function d3_scale_niceStep(step) {\n return step ? {\n floor: function(x) {\n return Math.floor(x / step) * step;\n },\n ceil: function(x) {\n return Math.ceil(x / step) * step;\n }\n } : d3_scale_niceIdentity;\n }\n var d3_scale_niceIdentity = {\n floor: d3_identity,\n ceil: d3_identity\n };\n function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n if (domain[k] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n while (++j <= k) {\n u.push(uninterpolate(domain[j - 1], domain[j]));\n i.push(interpolate(range[j - 1], range[j]));\n }\n return function(x) {\n var j = d3.bisect(domain, x, 1, k) - 1;\n return i[j](u[j](x));\n };\n }\n d3.scale.linear = function() {\n return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n };\n function d3_scale_linear(domain, range, interpolate, clamp) {\n var output, input;\n function rescale() {\n var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n output = linear(domain, range, uninterpolate, interpolate);\n input = linear(range, domain, uninterpolate, d3_interpolate);\n return scale;\n }\n function scale(x) {\n return output(x);\n }\n scale.invert = function(y) {\n return input(y);\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(Number);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.rangeRound = function(x) {\n return scale.range(x).interpolate(d3_interpolateRound);\n };\n scale.clamp = function(x) {\n if (!arguments.length) return clamp;\n clamp = x;\n return rescale();\n };\n scale.interpolate = function(x) {\n if (!arguments.length) return interpolate;\n interpolate = x;\n return rescale();\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n d3_scale_linearNice(domain, m);\n return rescale();\n };\n scale.copy = function() {\n return d3_scale_linear(domain, range, interpolate, clamp);\n };\n return rescale();\n }\n function d3_scale_linearRebind(scale, linear) {\n return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n }\n function d3_scale_linearNice(domain, m) {\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n return domain;\n }\n function d3_scale_linearTickRange(domain, m) {\n if (m == null) m = 10;\n var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n extent[0] = Math.ceil(extent[0] / step) * step;\n extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n extent[2] = step;\n return extent;\n }\n function d3_scale_linearTicks(domain, m) {\n return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n }\n function d3_scale_linearTickFormat(domain, m, format) {\n var range = d3_scale_linearTickRange(domain, m);\n if (format) {\n var match = d3_format_re.exec(format);\n match.shift();\n if (match[8] === \"s\") {\n var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n match[8] = \"f\";\n format = d3.format(match.join(\"\"));\n return function(d) {\n return format(prefix.scale(d)) + prefix.symbol;\n };\n }\n if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n format = match.join(\"\");\n } else {\n format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n }\n return d3.format(format);\n }\n var d3_scale_linearFormatSignificant = {\n s: 1,\n g: 1,\n p: 1,\n r: 1,\n e: 1\n };\n function d3_scale_linearPrecision(value) {\n return -Math.floor(Math.log(value) / Math.LN10 + .01);\n }\n function d3_scale_linearFormatPrecision(type, range) {\n var p = d3_scale_linearPrecision(range[2]);\n return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n }\n d3.scale.log = function() {\n return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n };\n function d3_scale_log(linear, base, positive, domain) {\n function log(x) {\n return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n }\n function pow(x) {\n return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n }\n function scale(x) {\n return linear(log(x));\n }\n scale.invert = function(x) {\n return pow(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n positive = x[0] >= 0;\n linear.domain((domain = x.map(Number)).map(log));\n return scale;\n };\n scale.base = function(_) {\n if (!arguments.length) return base;\n base = +_;\n linear.domain(domain.map(log));\n return scale;\n };\n scale.nice = function() {\n var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n linear.domain(niced);\n domain = niced.map(pow);\n return scale;\n };\n scale.ticks = function() {\n var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n if (isFinite(j - i)) {\n if (positive) {\n for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n ticks.push(pow(i));\n } else {\n ticks.push(pow(i));\n for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n }\n for (i = 0; ticks[i] < u; i++) {}\n for (j = ticks.length; ticks[j - 1] > v; j--) {}\n ticks = ticks.slice(i, j);\n }\n return ticks;\n };\n scale.tickFormat = function(n, format) {\n if (!arguments.length) return d3_scale_logFormat;\n if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n var k = Math.max(1, base * n / scale.ticks().length);\n return function(d) {\n var i = d / pow(Math.round(log(d)));\n if (i * base < base - .5) i *= base;\n return i <= k ? format(d) : \"\";\n };\n };\n scale.copy = function() {\n return d3_scale_log(linear.copy(), base, positive, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n floor: function(x) {\n return -Math.ceil(-x);\n },\n ceil: function(x) {\n return -Math.floor(-x);\n }\n };\n d3.scale.pow = function() {\n return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n };\n function d3_scale_pow(linear, exponent, domain) {\n var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n function scale(x) {\n return linear(powp(x));\n }\n scale.invert = function(x) {\n return powb(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n linear.domain((domain = x.map(Number)).map(powp));\n return scale;\n };\n scale.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n scale.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n scale.nice = function(m) {\n return scale.domain(d3_scale_linearNice(domain, m));\n };\n scale.exponent = function(x) {\n if (!arguments.length) return exponent;\n powp = d3_scale_powPow(exponent = x);\n powb = d3_scale_powPow(1 / exponent);\n linear.domain(domain.map(powp));\n return scale;\n };\n scale.copy = function() {\n return d3_scale_pow(linear.copy(), exponent, domain);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_scale_powPow(e) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n };\n }\n d3.scale.sqrt = function() {\n return d3.scale.pow().exponent(.5);\n };\n d3.scale.ordinal = function() {\n return d3_scale_ordinal([], {\n t: \"range\",\n a: [ [] ]\n });\n };\n function d3_scale_ordinal(domain, ranger) {\n var index, range, rangeBand;\n function scale(x) {\n return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n }\n function steps(start, step) {\n return d3.range(domain.length).map(function(i) {\n return start + step * i;\n });\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = [];\n index = new d3_Map();\n var i = -1, n = x.length, xi;\n while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n return scale[ranger.t].apply(scale, ranger.a);\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n rangeBand = 0;\n ranger = {\n t: \"range\",\n a: arguments\n };\n return scale;\n };\n scale.rangePoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n 0) : (stop - start) / (domain.length - 1 + padding);\n range = steps(start + step * padding / 2, step);\n rangeBand = 0;\n ranger = {\n t: \"rangePoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundPoints = function(x, padding) {\n if (arguments.length < 2) padding = 0;\n var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n 0) : (stop - start) / (domain.length - 1 + padding) | 0;\n range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n rangeBand = 0;\n ranger = {\n t: \"rangeRoundPoints\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n range = steps(start + step * outerPadding, step);\n if (reverse) range.reverse();\n rangeBand = step * (1 - padding);\n ranger = {\n t: \"rangeBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeRoundBands = function(x, padding, outerPadding) {\n if (arguments.length < 2) padding = 0;\n if (arguments.length < 3) outerPadding = padding;\n var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n if (reverse) range.reverse();\n rangeBand = Math.round(step * (1 - padding));\n ranger = {\n t: \"rangeRoundBands\",\n a: arguments\n };\n return scale;\n };\n scale.rangeBand = function() {\n return rangeBand;\n };\n scale.rangeExtent = function() {\n return d3_scaleExtent(ranger.a[0]);\n };\n scale.copy = function() {\n return d3_scale_ordinal(domain, ranger);\n };\n return scale.domain(domain);\n }\n d3.scale.category10 = function() {\n return d3.scale.ordinal().range(d3_category10);\n };\n d3.scale.category20 = function() {\n return d3.scale.ordinal().range(d3_category20);\n };\n d3.scale.category20b = function() {\n return d3.scale.ordinal().range(d3_category20b);\n };\n d3.scale.category20c = function() {\n return d3.scale.ordinal().range(d3_category20c);\n };\n var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n d3.scale.quantile = function() {\n return d3_scale_quantile([], []);\n };\n function d3_scale_quantile(domain, range) {\n var thresholds;\n function rescale() {\n var k = 0, q = range.length;\n thresholds = [];\n while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n return scale;\n }\n function scale(x) {\n if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n }\n scale.domain = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.quantiles = function() {\n return thresholds;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n };\n scale.copy = function() {\n return d3_scale_quantile(domain, range);\n };\n return rescale();\n }\n d3.scale.quantize = function() {\n return d3_scale_quantize(0, 1, [ 0, 1 ]);\n };\n function d3_scale_quantize(x0, x1, range) {\n var kx, i;\n function scale(x) {\n return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n }\n function rescale() {\n kx = range.length / (x1 - x0);\n i = range.length - 1;\n return scale;\n }\n scale.domain = function(x) {\n if (!arguments.length) return [ x0, x1 ];\n x0 = +x[0];\n x1 = +x[x.length - 1];\n return rescale();\n };\n scale.range = function(x) {\n if (!arguments.length) return range;\n range = x;\n return rescale();\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n y = y < 0 ? NaN : y / kx + x0;\n return [ y, y + 1 / kx ];\n };\n scale.copy = function() {\n return d3_scale_quantize(x0, x1, range);\n };\n return rescale();\n }\n d3.scale.threshold = function() {\n return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n };\n function d3_scale_threshold(domain, range) {\n function scale(x) {\n if (x <= x) return range[d3.bisect(domain, x)];\n }\n scale.domain = function(_) {\n if (!arguments.length) return domain;\n domain = _;\n return scale;\n };\n scale.range = function(_) {\n if (!arguments.length) return range;\n range = _;\n return scale;\n };\n scale.invertExtent = function(y) {\n y = range.indexOf(y);\n return [ domain[y - 1], domain[y] ];\n };\n scale.copy = function() {\n return d3_scale_threshold(domain, range);\n };\n return scale;\n }\n d3.scale.identity = function() {\n return d3_scale_identity([ 0, 1 ]);\n };\n function d3_scale_identity(domain) {\n function identity(x) {\n return +x;\n }\n identity.invert = identity;\n identity.domain = identity.range = function(x) {\n if (!arguments.length) return domain;\n domain = x.map(identity);\n return identity;\n };\n identity.ticks = function(m) {\n return d3_scale_linearTicks(domain, m);\n };\n identity.tickFormat = function(m, format) {\n return d3_scale_linearTickFormat(domain, m, format);\n };\n identity.copy = function() {\n return d3_scale_identity(domain);\n };\n return identity;\n }\n d3.svg = {};\n function d3_zero() {\n return 0;\n }\n d3.svg.arc = function() {\n var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n function arc() {\n var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n if (!cw) p1 *= -1;\n if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n }\n if (r1) {\n x0 = r1 * Math.cos(a0 + p1);\n y0 = r1 * Math.sin(a0 + p1);\n x1 = r1 * Math.cos(a1 - p1);\n y1 = r1 * Math.sin(a1 - p1);\n var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n var h1 = (a0 + a1) / 2;\n x0 = r1 * Math.cos(h1);\n y0 = r1 * Math.sin(h1);\n x1 = y1 = null;\n }\n } else {\n x0 = y0 = 0;\n }\n if (r0) {\n x2 = r0 * Math.cos(a1 - p0);\n y2 = r0 * Math.sin(a1 - p0);\n x3 = r0 * Math.cos(a0 + p0);\n y3 = r0 * Math.sin(a0 + p0);\n var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n var h0 = (a0 + a1) / 2;\n x2 = r0 * Math.cos(h0);\n y2 = r0 * Math.sin(h0);\n x3 = y3 = null;\n }\n } else {\n x2 = y2 = 0;\n }\n if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n cr = r0 < r1 ^ cw ? 0 : 1;\n var rc1 = rc, rc0 = rc;\n if (da < π) {\n var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n }\n if (x1 != null) {\n var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n if (rc === rc1) {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n } else {\n path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n }\n if (x3 != null) {\n var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n if (rc === rc0) {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n } else {\n path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n }\n } else {\n path.push(\"L\", x2, \",\", y2);\n }\n } else {\n path.push(\"M\", x0, \",\", y0);\n if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n path.push(\"L\", x2, \",\", y2);\n if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n }\n path.push(\"Z\");\n return path.join(\"\");\n }\n function circleSegment(r1, cw) {\n return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n }\n arc.innerRadius = function(v) {\n if (!arguments.length) return innerRadius;\n innerRadius = d3_functor(v);\n return arc;\n };\n arc.outerRadius = function(v) {\n if (!arguments.length) return outerRadius;\n outerRadius = d3_functor(v);\n return arc;\n };\n arc.cornerRadius = function(v) {\n if (!arguments.length) return cornerRadius;\n cornerRadius = d3_functor(v);\n return arc;\n };\n arc.padRadius = function(v) {\n if (!arguments.length) return padRadius;\n padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n return arc;\n };\n arc.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return arc;\n };\n arc.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return arc;\n };\n arc.padAngle = function(v) {\n if (!arguments.length) return padAngle;\n padAngle = d3_functor(v);\n return arc;\n };\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n return [ Math.cos(a) * r, Math.sin(a) * r ];\n };\n return arc;\n };\n var d3_svg_arcAuto = \"auto\";\n function d3_svg_arcInnerRadius(d) {\n return d.innerRadius;\n }\n function d3_svg_arcOuterRadius(d) {\n return d.outerRadius;\n }\n function d3_svg_arcStartAngle(d) {\n return d.startAngle;\n }\n function d3_svg_arcEndAngle(d) {\n return d.endAngle;\n }\n function d3_svg_arcPadAngle(d) {\n return d && d.padAngle;\n }\n function d3_svg_arcSweep(x0, y0, x1, y1) {\n return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n }\n function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n }\n function d3_svg_line(projection) {\n var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n function line(data) {\n var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n function segment() {\n segments.push(\"M\", interpolate(projection(points), tension));\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n } else if (points.length) {\n segment();\n points = [];\n }\n }\n if (points.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n line.x = function(_) {\n if (!arguments.length) return x;\n x = _;\n return line;\n };\n line.y = function(_) {\n if (!arguments.length) return y;\n y = _;\n return line;\n };\n line.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return line;\n };\n line.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n return line;\n };\n line.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return line;\n };\n return line;\n }\n d3.svg.line = function() {\n return d3_svg_line(d3_identity);\n };\n var d3_svg_lineInterpolators = d3.map({\n linear: d3_svg_lineLinear,\n \"linear-closed\": d3_svg_lineLinearClosed,\n step: d3_svg_lineStep,\n \"step-before\": d3_svg_lineStepBefore,\n \"step-after\": d3_svg_lineStepAfter,\n basis: d3_svg_lineBasis,\n \"basis-open\": d3_svg_lineBasisOpen,\n \"basis-closed\": d3_svg_lineBasisClosed,\n bundle: d3_svg_lineBundle,\n cardinal: d3_svg_lineCardinal,\n \"cardinal-open\": d3_svg_lineCardinalOpen,\n \"cardinal-closed\": d3_svg_lineCardinalClosed,\n monotone: d3_svg_lineMonotone\n });\n d3_svg_lineInterpolators.forEach(function(key, value) {\n value.key = key;\n value.closed = /-closed$/.test(key);\n });\n function d3_svg_lineLinear(points) {\n return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n }\n function d3_svg_lineLinearClosed(points) {\n return points.join(\"L\") + \"Z\";\n }\n function d3_svg_lineStep(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n if (n > 1) path.push(\"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepBefore(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n return path.join(\"\");\n }\n function d3_svg_lineStepAfter(points) {\n var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n return path.join(\"\");\n }\n function d3_svg_lineCardinalOpen(points, tension) {\n return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineCardinalClosed(points, tension) {\n return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n }\n function d3_svg_lineCardinal(points, tension) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n }\n function d3_svg_lineHermite(points, tangents) {\n if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n return d3_svg_lineLinear(points);\n }\n var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n if (quad) {\n path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n p0 = points[1];\n pi = 2;\n }\n if (tangents.length > 1) {\n t = tangents[1];\n p = points[pi];\n pi++;\n path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n for (var i = 2; i < tangents.length; i++, pi++) {\n p = points[pi];\n t = tangents[i];\n path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n }\n }\n if (quad) {\n var lp = points[pi];\n path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n }\n return path;\n }\n function d3_svg_lineCardinalTangents(points, tension) {\n var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n while (++i < n) {\n p0 = p1;\n p1 = p2;\n p2 = points[i];\n tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n }\n return tangents;\n }\n function d3_svg_lineBasis(points) {\n if (points.length < 3) return d3_svg_lineLinear(points);\n var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n points.push(points[n - 1]);\n while (++i <= n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n points.pop();\n path.push(\"L\", pi);\n return path.join(\"\");\n }\n function d3_svg_lineBasisOpen(points) {\n if (points.length < 4) return d3_svg_lineLinear(points);\n var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n while (++i < 3) {\n pi = points[i];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n --i;\n while (++i < n) {\n pi = points[i];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBasisClosed(points) {\n var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n while (++i < 4) {\n pi = points[i % n];\n px.push(pi[0]);\n py.push(pi[1]);\n }\n path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n --i;\n while (++i < m) {\n pi = points[i % n];\n px.shift();\n px.push(pi[0]);\n py.shift();\n py.push(pi[1]);\n d3_svg_lineBasisBezier(path, px, py);\n }\n return path.join(\"\");\n }\n function d3_svg_lineBundle(points, tension) {\n var n = points.length - 1;\n if (n) {\n var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n while (++i <= n) {\n p = points[i];\n t = i / n;\n p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n }\n }\n return d3_svg_lineBasis(points);\n }\n function d3_svg_lineDot4(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n }\n var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n function d3_svg_lineBasisBezier(path, x, y) {\n path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n }\n function d3_svg_lineSlope(p0, p1) {\n return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n }\n function d3_svg_lineFiniteDifferences(points) {\n var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n while (++i < j) {\n m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n }\n m[i] = d;\n return m;\n }\n function d3_svg_lineMonotoneTangents(points) {\n var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n while (++i < j) {\n d = d3_svg_lineSlope(points[i], points[i + 1]);\n if (abs(d) < ε) {\n m[i] = m[i + 1] = 0;\n } else {\n a = m[i] / d;\n b = m[i + 1] / d;\n s = a * a + b * b;\n if (s > 9) {\n s = d * 3 / Math.sqrt(s);\n m[i] = s * a;\n m[i + 1] = s * b;\n }\n }\n }\n i = -1;\n while (++i <= j) {\n s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n tangents.push([ s || 0, m[i] * s || 0 ]);\n }\n return tangents;\n }\n function d3_svg_lineMonotone(points) {\n return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n }\n d3.svg.line.radial = function() {\n var line = d3_svg_line(d3_svg_lineRadial);\n line.radius = line.x, delete line.x;\n line.angle = line.y, delete line.y;\n return line;\n };\n function d3_svg_lineRadial(points) {\n var point, i = -1, n = points.length, r, a;\n while (++i < n) {\n point = points[i];\n r = point[0];\n a = point[1] - halfπ;\n point[0] = r * Math.cos(a);\n point[1] = r * Math.sin(a);\n }\n return points;\n }\n function d3_svg_area(projection) {\n var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n function area(data) {\n var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n return x;\n } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n return y;\n } : d3_functor(y1), x, y;\n function segment() {\n segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n }\n while (++i < n) {\n if (defined.call(this, d = data[i], i)) {\n points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n } else if (points0.length) {\n segment();\n points0 = [];\n points1 = [];\n }\n }\n if (points0.length) segment();\n return segments.length ? segments.join(\"\") : null;\n }\n area.x = function(_) {\n if (!arguments.length) return x1;\n x0 = x1 = _;\n return area;\n };\n area.x0 = function(_) {\n if (!arguments.length) return x0;\n x0 = _;\n return area;\n };\n area.x1 = function(_) {\n if (!arguments.length) return x1;\n x1 = _;\n return area;\n };\n area.y = function(_) {\n if (!arguments.length) return y1;\n y0 = y1 = _;\n return area;\n };\n area.y0 = function(_) {\n if (!arguments.length) return y0;\n y0 = _;\n return area;\n };\n area.y1 = function(_) {\n if (!arguments.length) return y1;\n y1 = _;\n return area;\n };\n area.defined = function(_) {\n if (!arguments.length) return defined;\n defined = _;\n return area;\n };\n area.interpolate = function(_) {\n if (!arguments.length) return interpolateKey;\n if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n interpolateReverse = interpolate.reverse || interpolate;\n L = interpolate.closed ? \"M\" : \"L\";\n return area;\n };\n area.tension = function(_) {\n if (!arguments.length) return tension;\n tension = _;\n return area;\n };\n return area;\n }\n d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n d3.svg.area = function() {\n return d3_svg_area(d3_identity);\n };\n d3.svg.area.radial = function() {\n var area = d3_svg_area(d3_svg_lineRadial);\n area.radius = area.x, delete area.x;\n area.innerRadius = area.x0, delete area.x0;\n area.outerRadius = area.x1, delete area.x1;\n area.angle = area.y, delete area.y;\n area.startAngle = area.y0, delete area.y0;\n area.endAngle = area.y1, delete area.y1;\n return area;\n };\n d3.svg.chord = function() {\n var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n function chord(d, i) {\n var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n }\n function subgroup(self, f, d, i) {\n var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n return {\n r: r,\n a0: a0,\n a1: a1,\n p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n };\n }\n function equals(a, b) {\n return a.a0 == b.a0 && a.a1 == b.a1;\n }\n function arc(r, p, a) {\n return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n }\n function curve(r0, p0, r1, p1) {\n return \"Q 0,0 \" + p1;\n }\n chord.radius = function(v) {\n if (!arguments.length) return radius;\n radius = d3_functor(v);\n return chord;\n };\n chord.source = function(v) {\n if (!arguments.length) return source;\n source = d3_functor(v);\n return chord;\n };\n chord.target = function(v) {\n if (!arguments.length) return target;\n target = d3_functor(v);\n return chord;\n };\n chord.startAngle = function(v) {\n if (!arguments.length) return startAngle;\n startAngle = d3_functor(v);\n return chord;\n };\n chord.endAngle = function(v) {\n if (!arguments.length) return endAngle;\n endAngle = d3_functor(v);\n return chord;\n };\n return chord;\n };\n function d3_svg_chordRadius(d) {\n return d.radius;\n }\n d3.svg.diagonal = function() {\n var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n function diagonal(d, i) {\n var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n x: p0.x,\n y: m\n }, {\n x: p3.x,\n y: m\n }, p3 ];\n p = p.map(projection);\n return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n }\n diagonal.source = function(x) {\n if (!arguments.length) return source;\n source = d3_functor(x);\n return diagonal;\n };\n diagonal.target = function(x) {\n if (!arguments.length) return target;\n target = d3_functor(x);\n return diagonal;\n };\n diagonal.projection = function(x) {\n if (!arguments.length) return projection;\n projection = x;\n return diagonal;\n };\n return diagonal;\n };\n function d3_svg_diagonalProjection(d) {\n return [ d.x, d.y ];\n }\n d3.svg.diagonal.radial = function() {\n var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n diagonal.projection = function(x) {\n return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n };\n return diagonal;\n };\n function d3_svg_diagonalRadialProjection(projection) {\n return function() {\n var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n return [ r * Math.cos(a), r * Math.sin(a) ];\n };\n }\n d3.svg.symbol = function() {\n var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n function symbol(d, i) {\n return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n }\n symbol.type = function(x) {\n if (!arguments.length) return type;\n type = d3_functor(x);\n return symbol;\n };\n symbol.size = function(x) {\n if (!arguments.length) return size;\n size = d3_functor(x);\n return symbol;\n };\n return symbol;\n };\n function d3_svg_symbolSize() {\n return 64;\n }\n function d3_svg_symbolType() {\n return \"circle\";\n }\n function d3_svg_symbolCircle(size) {\n var r = Math.sqrt(size / π);\n return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n }\n var d3_svg_symbols = d3.map({\n circle: d3_svg_symbolCircle,\n cross: function(size) {\n var r = Math.sqrt(size / 5) / 2;\n return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n },\n diamond: function(size) {\n var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n },\n square: function(size) {\n var r = Math.sqrt(size) / 2;\n return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n },\n \"triangle-down\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n },\n \"triangle-up\": function(size) {\n var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n }\n });\n d3.svg.symbolTypes = d3_svg_symbols.keys();\n var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n d3_selectionPrototype.transition = function(name) {\n var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n time: Date.now(),\n ease: d3_ease_cubicInOut,\n delay: 0,\n duration: 250\n };\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_selectionPrototype.interrupt = function(name) {\n return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n };\n var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n function d3_selection_interruptNS(ns) {\n return function() {\n var lock, activeId, active;\n if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n active.timer.c = null;\n active.timer.t = NaN;\n if (--lock.count) delete lock[activeId]; else delete this[ns];\n lock.active += .5;\n active.event && active.event.interrupt.call(this, this.__data__, active.index);\n }\n };\n }\n function d3_transition(groups, ns, id) {\n d3_subclass(groups, d3_transitionPrototype);\n groups.namespace = ns;\n groups.id = id;\n return groups;\n }\n var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n d3_transitionPrototype.call = d3_selectionPrototype.call;\n d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n d3_transitionPrototype.node = d3_selectionPrototype.node;\n d3_transitionPrototype.size = d3_selectionPrototype.size;\n d3.transition = function(selection, name) {\n return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n };\n d3.transition.prototype = d3_transitionPrototype;\n d3_transitionPrototype.select = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n selector = d3_selection_selector(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n subgroup.push(subnode);\n } else {\n subgroup.push(null);\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.selectAll = function(selector) {\n var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n selector = d3_selection_selectorAll(selector);\n for (var j = -1, m = this.length; ++j < m; ) {\n for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n if (node = group[i]) {\n transition = node[ns][id];\n subnodes = selector.call(node, node.__data__, i, j);\n subgroups.push(subgroup = []);\n for (var k = -1, o = subnodes.length; ++k < o; ) {\n if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n subgroup.push(subnode);\n }\n }\n }\n }\n return d3_transition(subgroups, ns, id);\n };\n d3_transitionPrototype.filter = function(filter) {\n var subgroups = [], subgroup, group, node;\n if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n subgroup.push(node);\n }\n }\n }\n return d3_transition(subgroups, this.namespace, this.id);\n };\n d3_transitionPrototype.tween = function(name, tween) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n return d3_selection_each(this, tween == null ? function(node) {\n node[ns][id].tween.remove(name);\n } : function(node) {\n node[ns][id].tween.set(name, tween);\n });\n };\n function d3_transition_tween(groups, name, value, tween) {\n var id = groups.id, ns = groups.namespace;\n return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n } : (value = tween(value), function(node) {\n node[ns][id].tween.set(name, value);\n }));\n }\n d3_transitionPrototype.attr = function(nameNS, value) {\n if (arguments.length < 2) {\n for (value in nameNS) this.attr(value, nameNS[value]);\n return this;\n }\n var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n function attrNull() {\n this.removeAttribute(name);\n }\n function attrNullNS() {\n this.removeAttributeNS(name.space, name.local);\n }\n function attrTween(b) {\n return b == null ? attrNull : (b += \"\", function() {\n var a = this.getAttribute(name), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttribute(name, i(t));\n });\n });\n }\n function attrTweenNS(b) {\n return b == null ? attrNullNS : (b += \"\", function() {\n var a = this.getAttributeNS(name.space, name.local), i;\n return a !== b && (i = interpolate(a, b), function(t) {\n this.setAttributeNS(name.space, name.local, i(t));\n });\n });\n }\n return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.attrTween = function(nameNS, tween) {\n var name = d3.ns.qualify(nameNS);\n function attrTween(d, i) {\n var f = tween.call(this, d, i, this.getAttribute(name));\n return f && function(t) {\n this.setAttribute(name, f(t));\n };\n }\n function attrTweenNS(d, i) {\n var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n return f && function(t) {\n this.setAttributeNS(name.space, name.local, f(t));\n };\n }\n return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n };\n d3_transitionPrototype.style = function(name, value, priority) {\n var n = arguments.length;\n if (n < 3) {\n if (typeof name !== \"string\") {\n if (n < 2) value = \"\";\n for (priority in name) this.style(priority, name[priority], value);\n return this;\n }\n priority = \"\";\n }\n function styleNull() {\n this.style.removeProperty(name);\n }\n function styleString(b) {\n return b == null ? styleNull : (b += \"\", function() {\n var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n return a !== b && (i = d3_interpolate(a, b), function(t) {\n this.style.setProperty(name, i(t), priority);\n });\n });\n }\n return d3_transition_tween(this, \"style.\" + name, value, styleString);\n };\n d3_transitionPrototype.styleTween = function(name, tween, priority) {\n if (arguments.length < 3) priority = \"\";\n function styleTween(d, i) {\n var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n return f && function(t) {\n this.style.setProperty(name, f(t), priority);\n };\n }\n return this.tween(\"style.\" + name, styleTween);\n };\n d3_transitionPrototype.text = function(value) {\n return d3_transition_tween(this, \"text\", value, d3_transition_text);\n };\n function d3_transition_text(b) {\n if (b == null) b = \"\";\n return function() {\n this.textContent = b;\n };\n }\n d3_transitionPrototype.remove = function() {\n var ns = this.namespace;\n return this.each(\"end.transition\", function() {\n var p;\n if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n });\n };\n d3_transitionPrototype.ease = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].ease;\n if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n return d3_selection_each(this, function(node) {\n node[ns][id].ease = value;\n });\n };\n d3_transitionPrototype.delay = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].delay;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].delay = +value.call(node, node.__data__, i, j);\n } : (value = +value, function(node) {\n node[ns][id].delay = value;\n }));\n };\n d3_transitionPrototype.duration = function(value) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 1) return this.node()[ns][id].duration;\n return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n } : (value = Math.max(1, value), function(node) {\n node[ns][id].duration = value;\n }));\n };\n d3_transitionPrototype.each = function(type, listener) {\n var id = this.id, ns = this.namespace;\n if (arguments.length < 2) {\n var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n try {\n d3_transitionInheritId = id;\n d3_selection_each(this, function(node, i, j) {\n d3_transitionInherit = node[ns][id];\n type.call(node, node.__data__, i, j);\n });\n } finally {\n d3_transitionInherit = inherit;\n d3_transitionInheritId = inheritId;\n }\n } else {\n d3_selection_each(this, function(node) {\n var transition = node[ns][id];\n (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n });\n }\n return this;\n };\n d3_transitionPrototype.transition = function() {\n var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n for (var j = 0, m = this.length; j < m; j++) {\n subgroups.push(subgroup = []);\n for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n if (node = group[i]) {\n transition = node[ns][id0];\n d3_transitionNode(node, i, ns, id1, {\n time: transition.time,\n ease: transition.ease,\n delay: transition.delay + transition.duration,\n duration: transition.duration\n });\n }\n subgroup.push(node);\n }\n }\n return d3_transition(subgroups, ns, id1);\n };\n function d3_transitionNamespace(name) {\n return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n }\n function d3_transitionNode(node, i, ns, id, inherit) {\n var lock = node[ns] || (node[ns] = {\n active: 0,\n count: 0\n }), transition = lock[id], time, timer, duration, ease, tweens;\n function schedule(elapsed) {\n var delay = transition.delay;\n timer.t = delay + time;\n if (delay <= elapsed) return start(elapsed - delay);\n timer.c = start;\n }\n function start(elapsed) {\n var activeId = lock.active, active = lock[activeId];\n if (active) {\n active.timer.c = null;\n active.timer.t = NaN;\n --lock.count;\n delete lock[activeId];\n active.event && active.event.interrupt.call(node, node.__data__, active.index);\n }\n for (var cancelId in lock) {\n if (+cancelId < id) {\n var cancel = lock[cancelId];\n cancel.timer.c = null;\n cancel.timer.t = NaN;\n --lock.count;\n delete lock[cancelId];\n }\n }\n timer.c = tick;\n d3_timer(function() {\n if (timer.c && tick(elapsed || 1)) {\n timer.c = null;\n timer.t = NaN;\n }\n return 1;\n }, 0, time);\n lock.active = id;\n transition.event && transition.event.start.call(node, node.__data__, i);\n tweens = [];\n transition.tween.forEach(function(key, value) {\n if (value = value.call(node, node.__data__, i)) {\n tweens.push(value);\n }\n });\n ease = transition.ease;\n duration = transition.duration;\n }\n function tick(elapsed) {\n var t = elapsed / duration, e = ease(t), n = tweens.length;\n while (n > 0) {\n tweens[--n].call(node, e);\n }\n if (t >= 1) {\n transition.event && transition.event.end.call(node, node.__data__, i);\n if (--lock.count) delete lock[id]; else delete node[ns];\n return 1;\n }\n }\n if (!transition) {\n time = inherit.time;\n timer = d3_timer(schedule, 0, time);\n transition = lock[id] = {\n tween: new d3_Map(),\n time: time,\n timer: timer,\n delay: inherit.delay,\n duration: inherit.duration,\n ease: inherit.ease,\n index: i\n };\n inherit = null;\n ++lock.count;\n }\n }\n d3.svg.axis = function() {\n var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n function axis(g) {\n g.each(function() {\n var g = d3.select(this);\n var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n d3.transition(path));\n tickEnter.append(\"line\");\n tickEnter.append(\"text\");\n var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n if (orient === \"bottom\" || orient === \"top\") {\n tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n } else {\n tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n }\n lineEnter.attr(y2, sign * innerTickSize);\n textEnter.attr(y1, sign * tickSpacing);\n lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n if (scale1.rangeBand) {\n var x = scale1, dx = x.rangeBand() / 2;\n scale0 = scale1 = function(d) {\n return x(d) + dx;\n };\n } else if (scale0.rangeBand) {\n scale0 = scale1;\n } else {\n tickExit.call(tickTransform, scale1, scale0);\n }\n tickEnter.call(tickTransform, scale0, scale1);\n tickUpdate.call(tickTransform, scale1, scale1);\n });\n }\n axis.scale = function(x) {\n if (!arguments.length) return scale;\n scale = x;\n return axis;\n };\n axis.orient = function(x) {\n if (!arguments.length) return orient;\n orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n return axis;\n };\n axis.ticks = function() {\n if (!arguments.length) return tickArguments_;\n tickArguments_ = d3_array(arguments);\n return axis;\n };\n axis.tickValues = function(x) {\n if (!arguments.length) return tickValues;\n tickValues = x;\n return axis;\n };\n axis.tickFormat = function(x) {\n if (!arguments.length) return tickFormat_;\n tickFormat_ = x;\n return axis;\n };\n axis.tickSize = function(x) {\n var n = arguments.length;\n if (!n) return innerTickSize;\n innerTickSize = +x;\n outerTickSize = +arguments[n - 1];\n return axis;\n };\n axis.innerTickSize = function(x) {\n if (!arguments.length) return innerTickSize;\n innerTickSize = +x;\n return axis;\n };\n axis.outerTickSize = function(x) {\n if (!arguments.length) return outerTickSize;\n outerTickSize = +x;\n return axis;\n };\n axis.tickPadding = function(x) {\n if (!arguments.length) return tickPadding;\n tickPadding = +x;\n return axis;\n };\n axis.tickSubdivide = function() {\n return arguments.length && axis;\n };\n return axis;\n };\n var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n top: 1,\n right: 1,\n bottom: 1,\n left: 1\n };\n function d3_svg_axisX(selection, x0, x1) {\n selection.attr(\"transform\", function(d) {\n var v0 = x0(d);\n return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n });\n }\n function d3_svg_axisY(selection, y0, y1) {\n selection.attr(\"transform\", function(d) {\n var v0 = y0(d);\n return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n });\n }\n d3.svg.brush = function() {\n var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n function brush(g) {\n g.each(function() {\n var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n var background = g.selectAll(\".background\").data([ 0 ]);\n background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n resize.exit().remove();\n resize.enter().append(\"g\").attr(\"class\", function(d) {\n return \"resize \" + d;\n }).style(\"cursor\", function(d) {\n return d3_svg_brushCursor[d];\n }).append(\"rect\").attr(\"x\", function(d) {\n return /[ew]$/.test(d) ? -3 : null;\n }).attr(\"y\", function(d) {\n return /^[ns]/.test(d) ? -3 : null;\n }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n resize.style(\"display\", brush.empty() ? \"none\" : null);\n var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n if (x) {\n range = d3_scaleRange(x);\n backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n redrawX(gUpdate);\n }\n if (y) {\n range = d3_scaleRange(y);\n backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n redrawY(gUpdate);\n }\n redraw(gUpdate);\n });\n }\n brush.event = function(g) {\n g.each(function() {\n var event_ = event.of(this, arguments), extent1 = {\n x: xExtent,\n y: yExtent,\n i: xExtentDomain,\n j: yExtentDomain\n }, extent0 = this.__chart__ || extent1;\n this.__chart__ = extent1;\n if (d3_transitionInheritId) {\n d3.select(this).transition().each(\"start.brush\", function() {\n xExtentDomain = extent0.i;\n yExtentDomain = extent0.j;\n xExtent = extent0.x;\n yExtent = extent0.y;\n event_({\n type: \"brushstart\"\n });\n }).tween(\"brush:brush\", function() {\n var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n xExtentDomain = yExtentDomain = null;\n return function(t) {\n xExtent = extent1.x = xi(t);\n yExtent = extent1.y = yi(t);\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n };\n }).each(\"end.brush\", function() {\n xExtentDomain = extent1.i;\n yExtentDomain = extent1.j;\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n });\n } else {\n event_({\n type: \"brushstart\"\n });\n event_({\n type: \"brush\",\n mode: \"resize\"\n });\n event_({\n type: \"brushend\"\n });\n }\n });\n };\n function redraw(g) {\n g.selectAll(\".resize\").attr(\"transform\", function(d) {\n return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n });\n }\n function redrawX(g) {\n g.select(\".extent\").attr(\"x\", xExtent[0]);\n g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n }\n function redrawY(g) {\n g.select(\".extent\").attr(\"y\", yExtent[0]);\n g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n }\n function brushstart() {\n var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n if (d3.event.changedTouches) {\n w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n } else {\n w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n }\n g.interrupt().selectAll(\"*\").interrupt();\n if (dragging) {\n origin[0] = xExtent[0] - origin[0];\n origin[1] = yExtent[0] - origin[1];\n } else if (resizing) {\n var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n origin[0] = xExtent[ex];\n origin[1] = yExtent[ey];\n } else if (d3.event.altKey) center = origin.slice();\n g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n event_({\n type: \"brushstart\"\n });\n brushmove();\n function keydown() {\n if (d3.event.keyCode == 32) {\n if (!dragging) {\n center = null;\n origin[0] -= xExtent[1];\n origin[1] -= yExtent[1];\n dragging = 2;\n }\n d3_eventPreventDefault();\n }\n }\n function keyup() {\n if (d3.event.keyCode == 32 && dragging == 2) {\n origin[0] += xExtent[1];\n origin[1] += yExtent[1];\n dragging = 0;\n d3_eventPreventDefault();\n }\n }\n function brushmove() {\n var point = d3.mouse(target), moved = false;\n if (offset) {\n point[0] += offset[0];\n point[1] += offset[1];\n }\n if (!dragging) {\n if (d3.event.altKey) {\n if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n origin[0] = xExtent[+(point[0] < center[0])];\n origin[1] = yExtent[+(point[1] < center[1])];\n } else center = null;\n }\n if (resizingX && move1(point, x, 0)) {\n redrawX(g);\n moved = true;\n }\n if (resizingY && move1(point, y, 1)) {\n redrawY(g);\n moved = true;\n }\n if (moved) {\n redraw(g);\n event_({\n type: \"brush\",\n mode: dragging ? \"move\" : \"resize\"\n });\n }\n }\n function move1(point, scale, i) {\n var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n if (dragging) {\n r0 -= position;\n r1 -= size + position;\n }\n min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n if (dragging) {\n max = (min += position) + size;\n } else {\n if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n if (position < min) {\n max = min;\n min = position;\n } else {\n max = position;\n }\n }\n if (extent[0] != min || extent[1] != max) {\n if (i) yExtentDomain = null; else xExtentDomain = null;\n extent[0] = min;\n extent[1] = max;\n return true;\n }\n }\n function brushend() {\n brushmove();\n g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n d3.select(\"body\").style(\"cursor\", null);\n w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n dragRestore();\n event_({\n type: \"brushend\"\n });\n }\n }\n brush.x = function(z) {\n if (!arguments.length) return x;\n x = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.y = function(z) {\n if (!arguments.length) return y;\n y = z;\n resizes = d3_svg_brushResizes[!x << 1 | !y];\n return brush;\n };\n brush.clamp = function(z) {\n if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n return brush;\n };\n brush.extent = function(z) {\n var x0, x1, y0, y1, t;\n if (!arguments.length) {\n if (x) {\n if (xExtentDomain) {\n x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n } else {\n x0 = xExtent[0], x1 = xExtent[1];\n if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n }\n }\n if (y) {\n if (yExtentDomain) {\n y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n } else {\n y0 = yExtent[0], y1 = yExtent[1];\n if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n }\n }\n return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n }\n if (x) {\n x0 = z[0], x1 = z[1];\n if (y) x0 = x0[0], x1 = x1[0];\n xExtentDomain = [ x0, x1 ];\n if (x.invert) x0 = x(x0), x1 = x(x1);\n if (x1 < x0) t = x0, x0 = x1, x1 = t;\n if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n }\n if (y) {\n y0 = z[0], y1 = z[1];\n if (x) y0 = y0[1], y1 = y1[1];\n yExtentDomain = [ y0, y1 ];\n if (y.invert) y0 = y(y0), y1 = y(y1);\n if (y1 < y0) t = y0, y0 = y1, y1 = t;\n if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n }\n return brush;\n };\n brush.clear = function() {\n if (!brush.empty()) {\n xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n xExtentDomain = yExtentDomain = null;\n }\n return brush;\n };\n brush.empty = function() {\n return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n };\n return d3.rebind(brush, event, \"on\");\n };\n var d3_svg_brushCursor = {\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 var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n var d3_time_formatUtc = d3_time_format.utc;\n var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n function d3_time_formatIsoNative(date) {\n return date.toISOString();\n }\n d3_time_formatIsoNative.parse = function(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n };\n d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n d3_time.second = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 1e3) * 1e3);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n }, function(date) {\n return date.getSeconds();\n });\n d3_time.seconds = d3_time.second.range;\n d3_time.seconds.utc = d3_time.second.utc.range;\n d3_time.minute = d3_time_interval(function(date) {\n return new d3_date(Math.floor(date / 6e4) * 6e4);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n }, function(date) {\n return date.getMinutes();\n });\n d3_time.minutes = d3_time.minute.range;\n d3_time.minutes.utc = d3_time.minute.utc.range;\n d3_time.hour = d3_time_interval(function(date) {\n var timezone = date.getTimezoneOffset() / 60;\n return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n }, function(date, offset) {\n date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n }, function(date) {\n return date.getHours();\n });\n d3_time.hours = d3_time.hour.range;\n d3_time.hours.utc = d3_time.hour.utc.range;\n d3_time.month = d3_time_interval(function(date) {\n date = d3_time.day(date);\n date.setDate(1);\n return date;\n }, function(date, offset) {\n date.setMonth(date.getMonth() + offset);\n }, function(date) {\n return date.getMonth();\n });\n d3_time.months = d3_time.month.range;\n d3_time.months.utc = d3_time.month.utc.range;\n function d3_time_scale(linear, methods, format) {\n function scale(x) {\n return linear(x);\n }\n scale.invert = function(x) {\n return d3_time_scaleDate(linear.invert(x));\n };\n scale.domain = function(x) {\n if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n linear.domain(x);\n return scale;\n };\n function tickMethod(extent, count) {\n var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n return d / 31536e6;\n }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n }\n scale.nice = function(interval, skip) {\n var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n if (method) interval = method[0], skip = method[1];\n function skipped(date) {\n return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n }\n return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n floor: function(date) {\n while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n return date;\n },\n ceil: function(date) {\n while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n return date;\n }\n } : interval));\n };\n scale.ticks = function(interval, skip) {\n var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n range: interval\n }, skip ];\n if (method) interval = method[0], skip = method[1];\n return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n };\n scale.tickFormat = function() {\n return format;\n };\n scale.copy = function() {\n return d3_time_scale(linear.copy(), methods, format);\n };\n return d3_scale_linearRebind(scale, linear);\n }\n function d3_time_scaleDate(t) {\n return new Date(t);\n }\n var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n return d.getMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getHours();\n } ], [ \"%a %d\", function(d) {\n return d.getDay() && d.getDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getMonth();\n } ], [ \"%Y\", d3_true ] ]);\n var d3_time_scaleMilliseconds = {\n range: function(start, stop, step) {\n return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n },\n floor: d3_identity,\n ceil: d3_identity\n };\n d3_time_scaleLocalMethods.year = d3_time.year;\n d3_time.scale = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n };\n var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n return [ m[0].utc, m[1] ];\n });\n var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n return d.getUTCMilliseconds();\n } ], [ \":%S\", function(d) {\n return d.getUTCSeconds();\n } ], [ \"%I:%M\", function(d) {\n return d.getUTCMinutes();\n } ], [ \"%I %p\", function(d) {\n return d.getUTCHours();\n } ], [ \"%a %d\", function(d) {\n return d.getUTCDay() && d.getUTCDate() != 1;\n } ], [ \"%b %d\", function(d) {\n return d.getUTCDate() != 1;\n } ], [ \"%B\", function(d) {\n return d.getUTCMonth();\n } ], [ \"%Y\", d3_true ] ]);\n d3_time_scaleUtcMethods.year = d3_time.year.utc;\n d3_time.scale.utc = function() {\n return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n };\n d3.text = d3_xhrType(function(request) {\n return request.responseText;\n });\n d3.json = function(url, callback) {\n return d3_xhr(url, \"application/json\", d3_json, callback);\n };\n function d3_json(request) {\n return JSON.parse(request.responseText);\n }\n d3.html = function(url, callback) {\n return d3_xhr(url, \"text/html\", d3_html, callback);\n };\n function d3_html(request) {\n var range = d3_document.createRange();\n range.selectNode(d3_document.body);\n return range.createContextualFragment(request.responseText);\n }\n d3.xml = d3_xhrType(function(request) {\n return request.responseXML;\n });\n if (typeof define === \"function\" && define.amd) this.d3 = d3, define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();\n })();\n});","\nrequire.register(\"phoenix/priv/static/phoenix.js\", function(exports, require, module) {\n require = __makeRelativeRequire(require, {}, \"phoenix\");\n (function() {\n (function(exports){\n\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Phoenix Channels JavaScript client\n//\n// ## Socket Connection\n//\n// A single connection is established to the server and\n// channels are multiplexed over the connection.\n// Connect to the server using the `Socket` class:\n//\n// let socket = new Socket(\"/ws\", {params: {userToken: \"123\"}})\n// socket.connect()\n//\n// The `Socket` constructor takes the mount point of the socket,\n// the authentication params, as well as options that can be found in\n// the Socket docs, such as configuring the `LongPoll` transport, and\n// heartbeat.\n//\n// ## Channels\n//\n// Channels are isolated, concurrent processes on the server that\n// subscribe to topics and broker events between the client and server.\n// To join a channel, you must provide the topic, and channel params for\n// authorization. Here's an example chat room example where `\"new_msg\"`\n// events are listened for, messages are pushed to the server, and\n// the channel is joined with ok/error/timeout matches:\n//\n// let channel = socket.channel(\"room:123\", {token: roomToken})\n// channel.on(\"new_msg\", msg => console.log(\"Got message\", msg) )\n// $input.onEnter( e => {\n// channel.push(\"new_msg\", {body: e.target.val}, 10000)\n// .receive(\"ok\", (msg) => console.log(\"created message\", msg) )\n// .receive(\"error\", (reasons) => console.log(\"create failed\", reasons) )\n// .receive(\"timeout\", () => console.log(\"Networking issue...\") )\n// })\n// channel.join()\n// .receive(\"ok\", ({messages}) => console.log(\"catching up\", messages) )\n// .receive(\"error\", ({reason}) => console.log(\"failed join\", reason) )\n// .receive(\"timeout\", () => console.log(\"Networking issue. Still waiting...\") )\n//\n//\n// ## Joining\n//\n// Creating a channel with `socket.channel(topic, params)`, binds the params to\n// `channel.params`, which are sent up on `channel.join()`.\n// Subsequent rejoins will send up the modified params for\n// updating authorization params, or passing up last_message_id information.\n// Successful joins receive an \"ok\" status, while unsuccessful joins\n// receive \"error\".\n//\n// ## Duplicate Join Subscriptions\n//\n// While the client may join any number of topics on any number of channels,\n// the client may only hold a single subscription for each unique topic at any\n// given time. When attempting to create a duplicate subscription,\n// the server will close the existing channel, log a warning, and\n// spawn a new channel for the topic. The client will have their\n// `channel.onClose` callbacks fired for the existing channel, and the new\n// channel join will have its receive hooks processed as normal.\n//\n// ## Pushing Messages\n//\n// From the previous example, we can see that pushing messages to the server\n// can be done with `channel.push(eventName, payload)` and we can optionally\n// receive responses from the push. Additionally, we can use\n// `receive(\"timeout\", callback)` to abort waiting for our other `receive` hooks\n// and take action after some period of waiting. The default timeout is 5000ms.\n//\n//\n// ## Socket Hooks\n//\n// Lifecycle events of the multiplexed connection can be hooked into via\n// `socket.onError()` and `socket.onClose()` events, ie:\n//\n// socket.onError( () => console.log(\"there was an error with the connection!\") )\n// socket.onClose( () => console.log(\"the connection dropped\") )\n//\n//\n// ## Channel Hooks\n//\n// For each joined channel, you can bind to `onError` and `onClose` events\n// to monitor the channel lifecycle, ie:\n//\n// channel.onError( () => console.log(\"there was an error!\") )\n// channel.onClose( () => console.log(\"the channel has gone away gracefully\") )\n//\n// ### onError hooks\n//\n// `onError` hooks are invoked if the socket connection drops, or the channel\n// crashes on the server. In either case, a channel rejoin is attempted\n// automatically in an exponential backoff manner.\n//\n// ### onClose hooks\n//\n// `onClose` hooks are invoked only in two cases. 1) the channel explicitly\n// closed on the server, or 2). The client explicitly closed, by calling\n// `channel.leave()`\n//\n//\n// ## Presence\n//\n// The `Presence` object provides features for syncing presence information\n// from the server with the client and handling presences joining and leaving.\n//\n// ### Syncing initial state from the server\n//\n// `Presence.syncState` is used to sync the list of presences on the server\n// with the client's state. An optional `onJoin` and `onLeave` callback can\n// be provided to react to changes in the client's local presences across\n// disconnects and reconnects with the server.\n//\n// `Presence.syncDiff` is used to sync a diff of presence join and leave\n// events from the server, as they happen. Like `syncState`, `syncDiff`\n// accepts optional `onJoin` and `onLeave` callbacks to react to a user\n// joining or leaving from a device.\n//\n// ### Listing Presences\n//\n// `Presence.list` is used to return a list of presence information\n// based on the local state of metadata. By default, all presence\n// metadata is returned, but a `listBy` function can be supplied to\n// allow the client to select which metadata to use for a given presence.\n// For example, you may have a user online from different devices with a\n// a metadata status of \"online\", but they have set themselves to \"away\"\n// on another device. In this case, they app may choose to use the \"away\"\n// status for what appears on the UI. The example below defines a `listBy`\n// function which prioritizes the first metadata which was registered for\n// each user. This could be the first tab they opened, or the first device\n// they came online from:\n//\n// let state = {}\n// state = Presence.syncState(state, stateFromServer)\n// let listBy = (id, {metas: [first, ...rest]}) => {\n// first.count = rest.length + 1 // count of this user's presences\n// first.id = id\n// return first\n// }\n// let onlineUsers = Presence.list(state, listBy)\n//\n//\n// ### Example Usage\n//\n// // detect if user has joined for the 1st time or from another tab/device\n// let onJoin = (id, current, newPres) => {\n// if(!current){\n// console.log(\"user has entered for the first time\", newPres)\n// } else {\n// console.log(\"user additional presence\", newPres)\n// }\n// }\n// // detect if user has left from all tabs/devices, or is still present\n// let onLeave = (id, current, leftPres) => {\n// if(current.metas.length === 0){\n// console.log(\"user has left from all devices\", leftPres)\n// } else {\n// console.log(\"user left from a device\", leftPres)\n// }\n// }\n// let presences = {} // client's initial empty presence state\n// // receive initial presence data from server, sent after join\n// myChannel.on(\"presences\", state => {\n// presences = Presence.syncState(presences, state, onJoin, onLeave)\n// displayUsers(Presence.list(presences))\n// })\n// // receive \"presence_diff\" from server, containing join/leave events\n// myChannel.on(\"presence_diff\", diff => {\n// presences = Presence.syncDiff(presences, diff, onJoin, onLeave)\n// this.setState({users: Presence.list(room.presences, listBy)})\n// })\n//\nvar VSN = \"1.0.0\";\nvar SOCKET_STATES = { connecting: 0, open: 1, closing: 2, closed: 3 };\nvar DEFAULT_TIMEOUT = 10000;\nvar CHANNEL_STATES = {\n closed: \"closed\",\n errored: \"errored\",\n joined: \"joined\",\n joining: \"joining\",\n leaving: \"leaving\"\n};\nvar CHANNEL_EVENTS = {\n close: \"phx_close\",\n error: \"phx_error\",\n join: \"phx_join\",\n reply: \"phx_reply\",\n leave: \"phx_leave\"\n};\nvar TRANSPORTS = {\n longpoll: \"longpoll\",\n websocket: \"websocket\"\n};\n\nvar Push = function () {\n\n // Initializes the Push\n //\n // channel - The Channel\n // event - The event, for example `\"phx_join\"`\n // payload - The payload, for example `{user_id: 123}`\n // timeout - The push timeout in milliseconds\n //\n\n function Push(channel, event, payload, timeout) {\n _classCallCheck(this, Push);\n\n this.channel = channel;\n this.event = event;\n this.payload = payload || {};\n this.receivedResp = null;\n this.timeout = timeout;\n this.timeoutTimer = null;\n this.recHooks = [];\n this.sent = false;\n }\n\n _createClass(Push, [{\n key: \"resend\",\n value: function resend(timeout) {\n this.timeout = timeout;\n this.cancelRefEvent();\n this.ref = null;\n this.refEvent = null;\n this.receivedResp = null;\n this.sent = false;\n this.send();\n }\n }, {\n key: \"send\",\n value: function send() {\n if (this.hasReceived(\"timeout\")) {\n return;\n }\n this.startTimeout();\n this.sent = true;\n this.channel.socket.push({\n topic: this.channel.topic,\n event: this.event,\n payload: this.payload,\n ref: this.ref\n });\n }\n }, {\n key: \"receive\",\n value: function receive(status, callback) {\n if (this.hasReceived(status)) {\n callback(this.receivedResp.response);\n }\n\n this.recHooks.push({ status: status, callback: callback });\n return this;\n }\n\n // private\n\n }, {\n key: \"matchReceive\",\n value: function matchReceive(_ref) {\n var status = _ref.status;\n var response = _ref.response;\n var ref = _ref.ref;\n\n this.recHooks.filter(function (h) {\n return h.status === status;\n }).forEach(function (h) {\n return h.callback(response);\n });\n }\n }, {\n key: \"cancelRefEvent\",\n value: function cancelRefEvent() {\n if (!this.refEvent) {\n return;\n }\n this.channel.off(this.refEvent);\n }\n }, {\n key: \"cancelTimeout\",\n value: function cancelTimeout() {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = null;\n }\n }, {\n key: \"startTimeout\",\n value: function startTimeout() {\n var _this = this;\n\n if (this.timeoutTimer) {\n return;\n }\n this.ref = this.channel.socket.makeRef();\n this.refEvent = this.channel.replyEventName(this.ref);\n\n this.channel.on(this.refEvent, function (payload) {\n _this.cancelRefEvent();\n _this.cancelTimeout();\n _this.receivedResp = payload;\n _this.matchReceive(payload);\n });\n\n this.timeoutTimer = setTimeout(function () {\n _this.trigger(\"timeout\", {});\n }, this.timeout);\n }\n }, {\n key: \"hasReceived\",\n value: function hasReceived(status) {\n return this.receivedResp && this.receivedResp.status === status;\n }\n }, {\n key: \"trigger\",\n value: function trigger(status, response) {\n this.channel.trigger(this.refEvent, { status: status, response: response });\n }\n }]);\n\n return Push;\n}();\n\nvar Channel = exports.Channel = function () {\n function Channel(topic, params, socket) {\n var _this2 = this;\n\n _classCallCheck(this, Channel);\n\n this.state = CHANNEL_STATES.closed;\n this.topic = topic;\n this.params = params || {};\n this.socket = socket;\n this.bindings = [];\n this.timeout = this.socket.timeout;\n this.joinedOnce = false;\n this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout);\n this.pushBuffer = [];\n this.rejoinTimer = new Timer(function () {\n return _this2.rejoinUntilConnected();\n }, this.socket.reconnectAfterMs);\n this.joinPush.receive(\"ok\", function () {\n _this2.state = CHANNEL_STATES.joined;\n _this2.rejoinTimer.reset();\n _this2.pushBuffer.forEach(function (pushEvent) {\n return pushEvent.send();\n });\n _this2.pushBuffer = [];\n });\n this.onClose(function () {\n _this2.rejoinTimer.reset();\n _this2.socket.log(\"channel\", \"close \" + _this2.topic + \" \" + _this2.joinRef());\n _this2.state = CHANNEL_STATES.closed;\n _this2.socket.remove(_this2);\n });\n this.onError(function (reason) {\n if (_this2.isLeaving() || _this2.isClosed()) {\n return;\n }\n _this2.socket.log(\"channel\", \"error \" + _this2.topic, reason);\n _this2.state = CHANNEL_STATES.errored;\n _this2.rejoinTimer.scheduleTimeout();\n });\n this.joinPush.receive(\"timeout\", function () {\n if (!_this2.isJoining()) {\n return;\n }\n _this2.socket.log(\"channel\", \"timeout \" + _this2.topic, _this2.joinPush.timeout);\n _this2.state = CHANNEL_STATES.errored;\n _this2.rejoinTimer.scheduleTimeout();\n });\n this.on(CHANNEL_EVENTS.reply, function (payload, ref) {\n _this2.trigger(_this2.replyEventName(ref), payload);\n });\n }\n\n _createClass(Channel, [{\n key: \"rejoinUntilConnected\",\n value: function rejoinUntilConnected() {\n this.rejoinTimer.scheduleTimeout();\n if (this.socket.isConnected()) {\n this.rejoin();\n }\n }\n }, {\n key: \"join\",\n value: function join() {\n var timeout = arguments.length <= 0 || arguments[0] === undefined ? this.timeout : arguments[0];\n\n if (this.joinedOnce) {\n throw \"tried to join multiple times. 'join' can only be called a single time per channel instance\";\n } else {\n this.joinedOnce = true;\n this.rejoin(timeout);\n return this.joinPush;\n }\n }\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n this.on(CHANNEL_EVENTS.close, callback);\n }\n }, {\n key: \"onError\",\n value: function onError(callback) {\n this.on(CHANNEL_EVENTS.error, function (reason) {\n return callback(reason);\n });\n }\n }, {\n key: \"on\",\n value: function on(event, callback) {\n this.bindings.push({ event: event, callback: callback });\n }\n }, {\n key: \"off\",\n value: function off(event) {\n this.bindings = this.bindings.filter(function (bind) {\n return bind.event !== event;\n });\n }\n }, {\n key: \"canPush\",\n value: function canPush() {\n return this.socket.isConnected() && this.isJoined();\n }\n }, {\n key: \"push\",\n value: function push(event, payload) {\n var timeout = arguments.length <= 2 || arguments[2] === undefined ? this.timeout : arguments[2];\n\n if (!this.joinedOnce) {\n throw \"tried to push '\" + event + \"' to '\" + this.topic + \"' before joining. Use channel.join() before pushing events\";\n }\n var pushEvent = new Push(this, event, payload, timeout);\n if (this.canPush()) {\n pushEvent.send();\n } else {\n pushEvent.startTimeout();\n this.pushBuffer.push(pushEvent);\n }\n\n return pushEvent;\n }\n\n // Leaves the channel\n //\n // Unsubscribes from server events, and\n // instructs channel to terminate on server\n //\n // Triggers onClose() hooks\n //\n // To receive leave acknowledgements, use the a `receive`\n // hook to bind to the server ack, ie:\n //\n // channel.leave().receive(\"ok\", () => alert(\"left!\") )\n //\n\n }, {\n key: \"leave\",\n value: function leave() {\n var _this3 = this;\n\n var timeout = arguments.length <= 0 || arguments[0] === undefined ? this.timeout : arguments[0];\n\n this.state = CHANNEL_STATES.leaving;\n var onClose = function onClose() {\n _this3.socket.log(\"channel\", \"leave \" + _this3.topic);\n _this3.trigger(CHANNEL_EVENTS.close, \"leave\", _this3.joinRef());\n };\n var leavePush = new Push(this, CHANNEL_EVENTS.leave, {}, timeout);\n leavePush.receive(\"ok\", function () {\n return onClose();\n }).receive(\"timeout\", function () {\n return onClose();\n });\n leavePush.send();\n if (!this.canPush()) {\n leavePush.trigger(\"ok\", {});\n }\n\n return leavePush;\n }\n\n // Overridable message hook\n //\n // Receives all events for specialized message handling\n // before dispatching to the channel callbacks.\n //\n // Must return the payload, modified or unmodified\n\n }, {\n key: \"onMessage\",\n value: function onMessage(event, payload, ref) {\n return payload;\n }\n\n // private\n\n }, {\n key: \"isMember\",\n value: function isMember(topic) {\n return this.topic === topic;\n }\n }, {\n key: \"joinRef\",\n value: function joinRef() {\n return this.joinPush.ref;\n }\n }, {\n key: \"sendJoin\",\n value: function sendJoin(timeout) {\n this.state = CHANNEL_STATES.joining;\n this.joinPush.resend(timeout);\n }\n }, {\n key: \"rejoin\",\n value: function rejoin() {\n var timeout = arguments.length <= 0 || arguments[0] === undefined ? this.timeout : arguments[0];\n if (this.isLeaving()) {\n return;\n }\n this.sendJoin(timeout);\n }\n }, {\n key: \"trigger\",\n value: function trigger(event, payload, ref) {\n var close = CHANNEL_EVENTS.close;\n var error = CHANNEL_EVENTS.error;\n var leave = CHANNEL_EVENTS.leave;\n var join = CHANNEL_EVENTS.join;\n\n if (ref && [close, error, leave, join].indexOf(event) >= 0 && ref !== this.joinRef()) {\n return;\n }\n var handledPayload = this.onMessage(event, payload, ref);\n if (payload && !handledPayload) {\n throw \"channel onMessage callbacks must return the payload, modified or unmodified\";\n }\n\n this.bindings.filter(function (bind) {\n return bind.event === event;\n }).map(function (bind) {\n return bind.callback(handledPayload, ref);\n });\n }\n }, {\n key: \"replyEventName\",\n value: function replyEventName(ref) {\n return \"chan_reply_\" + ref;\n }\n }, {\n key: \"isClosed\",\n value: function isClosed() {\n return this.state === CHANNEL_STATES.closed;\n }\n }, {\n key: \"isErrored\",\n value: function isErrored() {\n return this.state === CHANNEL_STATES.errored;\n }\n }, {\n key: \"isJoined\",\n value: function isJoined() {\n return this.state === CHANNEL_STATES.joined;\n }\n }, {\n key: \"isJoining\",\n value: function isJoining() {\n return this.state === CHANNEL_STATES.joining;\n }\n }, {\n key: \"isLeaving\",\n value: function isLeaving() {\n return this.state === CHANNEL_STATES.leaving;\n }\n }]);\n\n return Channel;\n}();\n\nvar Socket = exports.Socket = function () {\n\n // Initializes the Socket\n //\n // endPoint - The string WebSocket endpoint, ie, \"ws://example.com/ws\",\n // \"wss://example.com\"\n // \"/ws\" (inherited host & protocol)\n // opts - Optional configuration\n // transport - The Websocket Transport, for example WebSocket or Phoenix.LongPoll.\n // Defaults to WebSocket with automatic LongPoll fallback.\n // timeout - The default timeout in milliseconds to trigger push timeouts.\n // Defaults `DEFAULT_TIMEOUT`\n // heartbeatIntervalMs - The millisec interval to send a heartbeat message\n // reconnectAfterMs - The optional function that returns the millsec\n // reconnect interval. Defaults to stepped backoff of:\n //\n // function(tries){\n // return [1000, 5000, 10000][tries - 1] || 10000\n // }\n //\n // logger - The optional function for specialized logging, ie:\n // `logger: (kind, msg, data) => { console.log(`${kind}: ${msg}`, data) }\n //\n // longpollerTimeout - The maximum timeout of a long poll AJAX request.\n // Defaults to 20s (double the server long poll timer).\n //\n // params - The optional params to pass when connecting\n //\n // For IE8 support use an ES5-shim (https://github.com/es-shims/es5-shim)\n //\n\n function Socket(endPoint) {\n var _this4 = this;\n\n var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n _classCallCheck(this, Socket);\n\n this.stateChangeCallbacks = { open: [], close: [], error: [], message: [] };\n this.channels = [];\n this.sendBuffer = [];\n this.ref = 0;\n this.timeout = opts.timeout || DEFAULT_TIMEOUT;\n this.transport = opts.transport || window.WebSocket || LongPoll;\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 30000;\n this.reconnectAfterMs = opts.reconnectAfterMs || function (tries) {\n return [1000, 2000, 5000, 10000][tries - 1] || 10000;\n };\n this.logger = opts.logger || function () {}; // noop\n this.longpollerTimeout = opts.longpollerTimeout || 20000;\n this.params = opts.params || {};\n this.endPoint = endPoint + \"/\" + TRANSPORTS.websocket;\n this.reconnectTimer = new Timer(function () {\n _this4.disconnect(function () {\n return _this4.connect();\n });\n }, this.reconnectAfterMs);\n }\n\n _createClass(Socket, [{\n key: \"protocol\",\n value: function protocol() {\n return location.protocol.match(/^https/) ? \"wss\" : \"ws\";\n }\n }, {\n key: \"endPointURL\",\n value: function endPointURL() {\n var uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params), { vsn: VSN });\n if (uri.charAt(0) !== \"/\") {\n return uri;\n }\n if (uri.charAt(1) === \"/\") {\n return this.protocol() + \":\" + uri;\n }\n\n return this.protocol() + \"://\" + location.host + uri;\n }\n }, {\n key: \"disconnect\",\n value: function disconnect(callback, code, reason) {\n if (this.conn) {\n this.conn.onclose = function () {}; // noop\n if (code) {\n this.conn.close(code, reason || \"\");\n } else {\n this.conn.close();\n }\n this.conn = null;\n }\n callback && callback();\n }\n\n // params - The params to send when connecting, for example `{user_id: userToken}`\n\n }, {\n key: \"connect\",\n value: function connect(params) {\n var _this5 = this;\n\n if (params) {\n console && console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\");\n this.params = params;\n }\n if (this.conn) {\n return;\n }\n\n this.conn = new this.transport(this.endPointURL());\n this.conn.timeout = this.longpollerTimeout;\n this.conn.onopen = function () {\n return _this5.onConnOpen();\n };\n this.conn.onerror = function (error) {\n return _this5.onConnError(error);\n };\n this.conn.onmessage = function (event) {\n return _this5.onConnMessage(event);\n };\n this.conn.onclose = function (event) {\n return _this5.onConnClose(event);\n };\n }\n\n // Logs the message. Override `this.logger` for specialized logging. noops by default\n\n }, {\n key: \"log\",\n value: function log(kind, msg, data) {\n this.logger(kind, msg, data);\n }\n\n // Registers callbacks for connection state change events\n //\n // Examples\n //\n // socket.onError(function(error){ alert(\"An error occurred\") })\n //\n\n }, {\n key: \"onOpen\",\n value: function onOpen(callback) {\n this.stateChangeCallbacks.open.push(callback);\n }\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n this.stateChangeCallbacks.close.push(callback);\n }\n }, {\n key: \"onError\",\n value: function onError(callback) {\n this.stateChangeCallbacks.error.push(callback);\n }\n }, {\n key: \"onMessage\",\n value: function onMessage(callback) {\n this.stateChangeCallbacks.message.push(callback);\n }\n }, {\n key: \"onConnOpen\",\n value: function onConnOpen() {\n var _this6 = this;\n\n this.log(\"transport\", \"connected to \" + this.endPointURL(), this.transport.prototype);\n this.flushSendBuffer();\n this.reconnectTimer.reset();\n if (!this.conn.skipHeartbeat) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = setInterval(function () {\n return _this6.sendHeartbeat();\n }, this.heartbeatIntervalMs);\n }\n this.stateChangeCallbacks.open.forEach(function (callback) {\n return callback();\n });\n }\n }, {\n key: \"onConnClose\",\n value: function onConnClose(event) {\n this.log(\"transport\", \"close\", event);\n this.triggerChanError();\n clearInterval(this.heartbeatTimer);\n this.reconnectTimer.scheduleTimeout();\n this.stateChangeCallbacks.close.forEach(function (callback) {\n return callback(event);\n });\n }\n }, {\n key: \"onConnError\",\n value: function onConnError(error) {\n this.log(\"transport\", error);\n this.triggerChanError();\n this.stateChangeCallbacks.error.forEach(function (callback) {\n return callback(error);\n });\n }\n }, {\n key: \"triggerChanError\",\n value: function triggerChanError() {\n this.channels.forEach(function (channel) {\n return channel.trigger(CHANNEL_EVENTS.error);\n });\n }\n }, {\n key: \"connectionState\",\n value: function connectionState() {\n switch (this.conn && this.conn.readyState) {\n case SOCKET_STATES.connecting:\n return \"connecting\";\n case SOCKET_STATES.open:\n return \"open\";\n case SOCKET_STATES.closing:\n return \"closing\";\n default:\n return \"closed\";\n }\n }\n }, {\n key: \"isConnected\",\n value: function isConnected() {\n return this.connectionState() === \"open\";\n }\n }, {\n key: \"remove\",\n value: function remove(channel) {\n this.channels = this.channels.filter(function (c) {\n return c.joinRef() !== channel.joinRef();\n });\n }\n }, {\n key: \"channel\",\n value: function channel(topic) {\n var chanParams = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var chan = new Channel(topic, chanParams, this);\n this.channels.push(chan);\n return chan;\n }\n }, {\n key: \"push\",\n value: function push(data) {\n var _this7 = this;\n\n var topic = data.topic;\n var event = data.event;\n var payload = data.payload;\n var ref = data.ref;\n\n var callback = function callback() {\n return _this7.conn.send(JSON.stringify(data));\n };\n this.log(\"push\", topic + \" \" + event + \" (\" + ref + \")\", payload);\n if (this.isConnected()) {\n callback();\n } else {\n this.sendBuffer.push(callback);\n }\n }\n\n // Return the next message ref, accounting for overflows\n\n }, {\n key: \"makeRef\",\n value: function makeRef() {\n var newRef = this.ref + 1;\n if (newRef === this.ref) {\n this.ref = 0;\n } else {\n this.ref = newRef;\n }\n\n return this.ref.toString();\n }\n }, {\n key: \"sendHeartbeat\",\n value: function sendHeartbeat() {\n if (!this.isConnected()) {\n return;\n }\n this.push({ topic: \"phoenix\", event: \"heartbeat\", payload: {}, ref: this.makeRef() });\n }\n }, {\n key: \"flushSendBuffer\",\n value: function flushSendBuffer() {\n if (this.isConnected() && this.sendBuffer.length > 0) {\n this.sendBuffer.forEach(function (callback) {\n return callback();\n });\n this.sendBuffer = [];\n }\n }\n }, {\n key: \"onConnMessage\",\n value: function onConnMessage(rawMessage) {\n var msg = JSON.parse(rawMessage.data);\n var topic = msg.topic;\n var event = msg.event;\n var payload = msg.payload;\n var ref = msg.ref;\n\n this.log(\"receive\", (payload.status || \"\") + \" \" + topic + \" \" + event + \" \" + (ref && \"(\" + ref + \")\" || \"\"), payload);\n this.channels.filter(function (channel) {\n return channel.isMember(topic);\n }).forEach(function (channel) {\n return channel.trigger(event, payload, ref);\n });\n this.stateChangeCallbacks.message.forEach(function (callback) {\n return callback(msg);\n });\n }\n }]);\n\n return Socket;\n}();\n\nvar LongPoll = exports.LongPoll = function () {\n function LongPoll(endPoint) {\n _classCallCheck(this, LongPoll);\n\n this.endPoint = null;\n this.token = null;\n this.skipHeartbeat = true;\n this.onopen = function () {}; // noop\n this.onerror = function () {}; // noop\n this.onmessage = function () {}; // noop\n this.onclose = function () {}; // noop\n this.pollEndpoint = this.normalizeEndpoint(endPoint);\n this.readyState = SOCKET_STATES.connecting;\n\n this.poll();\n }\n\n _createClass(LongPoll, [{\n key: \"normalizeEndpoint\",\n value: function normalizeEndpoint(endPoint) {\n return endPoint.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\").replace(new RegExp(\"(.*)\\/\" + TRANSPORTS.websocket), \"$1/\" + TRANSPORTS.longpoll);\n }\n }, {\n key: \"endpointURL\",\n value: function endpointURL() {\n return Ajax.appendParams(this.pollEndpoint, { token: this.token });\n }\n }, {\n key: \"closeAndRetry\",\n value: function closeAndRetry() {\n this.close();\n this.readyState = SOCKET_STATES.connecting;\n }\n }, {\n key: \"ontimeout\",\n value: function ontimeout() {\n this.onerror(\"timeout\");\n this.closeAndRetry();\n }\n }, {\n key: \"poll\",\n value: function poll() {\n var _this8 = this;\n\n if (!(this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting)) {\n return;\n }\n\n Ajax.request(\"GET\", this.endpointURL(), \"application/json\", null, this.timeout, this.ontimeout.bind(this), function (resp) {\n if (resp) {\n var status = resp.status;\n var token = resp.token;\n var messages = resp.messages;\n\n _this8.token = token;\n } else {\n var status = 0;\n }\n\n switch (status) {\n case 200:\n messages.forEach(function (msg) {\n return _this8.onmessage({ data: JSON.stringify(msg) });\n });\n _this8.poll();\n break;\n case 204:\n _this8.poll();\n break;\n case 410:\n _this8.readyState = SOCKET_STATES.open;\n _this8.onopen();\n _this8.poll();\n break;\n case 0:\n case 500:\n _this8.onerror();\n _this8.closeAndRetry();\n break;\n default:\n throw \"unhandled poll status \" + status;\n }\n });\n }\n }, {\n key: \"send\",\n value: function send(body) {\n var _this9 = this;\n\n Ajax.request(\"POST\", this.endpointURL(), \"application/json\", body, this.timeout, this.onerror.bind(this, \"timeout\"), function (resp) {\n if (!resp || resp.status !== 200) {\n _this9.onerror(status);\n _this9.closeAndRetry();\n }\n });\n }\n }, {\n key: \"close\",\n value: function close(code, reason) {\n this.readyState = SOCKET_STATES.closed;\n this.onclose();\n }\n }]);\n\n return LongPoll;\n}();\n\nvar Ajax = exports.Ajax = function () {\n function Ajax() {\n _classCallCheck(this, Ajax);\n }\n\n _createClass(Ajax, null, [{\n key: \"request\",\n value: function request(method, endPoint, accept, body, timeout, ontimeout, callback) {\n if (window.XDomainRequest) {\n var req = new XDomainRequest(); // IE8, IE9\n this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);\n } else {\n var req = window.XMLHttpRequest ? new XMLHttpRequest() : // IE7+, Firefox, Chrome, Opera, Safari\n new ActiveXObject(\"Microsoft.XMLHTTP\"); // IE6, IE5\n this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback);\n }\n }\n }, {\n key: \"xdomainRequest\",\n value: function xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) {\n var _this10 = this;\n\n req.timeout = timeout;\n req.open(method, endPoint);\n req.onload = function () {\n var response = _this10.parseJSON(req.responseText);\n callback && callback(response);\n };\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n\n // Work around bug in IE9 that requires an attached onprogress handler\n req.onprogress = function () {};\n\n req.send(body);\n }\n }, {\n key: \"xhrRequest\",\n value: function xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) {\n var _this11 = this;\n\n req.timeout = timeout;\n req.open(method, endPoint, true);\n req.setRequestHeader(\"Content-Type\", accept);\n req.onerror = function () {\n callback && callback(null);\n };\n req.onreadystatechange = function () {\n if (req.readyState === _this11.states.complete && callback) {\n var response = _this11.parseJSON(req.responseText);\n callback(response);\n }\n };\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n\n req.send(body);\n }\n }, {\n key: \"parseJSON\",\n value: function parseJSON(resp) {\n return resp && resp !== \"\" ? JSON.parse(resp) : null;\n }\n }, {\n key: \"serialize\",\n value: function serialize(obj, parentKey) {\n var queryStr = [];\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n var paramKey = parentKey ? parentKey + \"[\" + key + \"]\" : key;\n var paramVal = obj[key];\n if ((typeof paramVal === \"undefined\" ? \"undefined\" : _typeof(paramVal)) === \"object\") {\n queryStr.push(this.serialize(paramVal, paramKey));\n } else {\n queryStr.push(encodeURIComponent(paramKey) + \"=\" + encodeURIComponent(paramVal));\n }\n }\n return queryStr.join(\"&\");\n }\n }, {\n key: \"appendParams\",\n value: function appendParams(url, params) {\n if (Object.keys(params).length === 0) {\n return url;\n }\n\n var prefix = url.match(/\\?/) ? \"&\" : \"?\";\n return \"\" + url + prefix + this.serialize(params);\n }\n }]);\n\n return Ajax;\n}();\n\nAjax.states = { complete: 4 };\n\nvar Presence = exports.Presence = {\n syncState: function syncState(currentState, newState, onJoin, onLeave) {\n var _this12 = this;\n\n var state = this.clone(currentState);\n var joins = {};\n var leaves = {};\n\n this.map(state, function (key, presence) {\n if (!newState[key]) {\n leaves[key] = presence;\n }\n });\n this.map(newState, function (key, newPresence) {\n var currentPresence = state[key];\n if (currentPresence) {\n (function () {\n var newRefs = newPresence.metas.map(function (m) {\n return m.phx_ref;\n });\n var curRefs = currentPresence.metas.map(function (m) {\n return m.phx_ref;\n });\n var joinedMetas = newPresence.metas.filter(function (m) {\n return curRefs.indexOf(m.phx_ref) < 0;\n });\n var leftMetas = currentPresence.metas.filter(function (m) {\n return newRefs.indexOf(m.phx_ref) < 0;\n });\n if (joinedMetas.length > 0) {\n joins[key] = newPresence;\n joins[key].metas = joinedMetas;\n }\n if (leftMetas.length > 0) {\n leaves[key] = _this12.clone(currentPresence);\n leaves[key].metas = leftMetas;\n }\n })();\n } else {\n joins[key] = newPresence;\n }\n });\n return this.syncDiff(state, { joins: joins, leaves: leaves }, onJoin, onLeave);\n },\n syncDiff: function syncDiff(currentState, _ref2, onJoin, onLeave) {\n var joins = _ref2.joins;\n var leaves = _ref2.leaves;\n\n var state = this.clone(currentState);\n if (!onJoin) {\n onJoin = function onJoin() {};\n }\n if (!onLeave) {\n onLeave = function onLeave() {};\n }\n\n this.map(joins, function (key, newPresence) {\n var currentPresence = state[key];\n state[key] = newPresence;\n if (currentPresence) {\n var _state$key$metas;\n\n (_state$key$metas = state[key].metas).unshift.apply(_state$key$metas, _toConsumableArray(currentPresence.metas));\n }\n onJoin(key, currentPresence, newPresence);\n });\n this.map(leaves, function (key, leftPresence) {\n var currentPresence = state[key];\n if (!currentPresence) {\n return;\n }\n var refsToRemove = leftPresence.metas.map(function (m) {\n return m.phx_ref;\n });\n currentPresence.metas = currentPresence.metas.filter(function (p) {\n return refsToRemove.indexOf(p.phx_ref) < 0;\n });\n onLeave(key, currentPresence, leftPresence);\n if (currentPresence.metas.length === 0) {\n delete state[key];\n }\n });\n return state;\n },\n list: function list(presences, chooser) {\n if (!chooser) {\n chooser = function chooser(key, pres) {\n return pres;\n };\n }\n\n return this.map(presences, function (key, presence) {\n return chooser(key, presence);\n });\n },\n\n // private\n\n map: function map(obj, func) {\n return Object.getOwnPropertyNames(obj).map(function (key) {\n return func(key, obj[key]);\n });\n },\n clone: function clone(obj) {\n return JSON.parse(JSON.stringify(obj));\n }\n};\n\n// Creates a timer that accepts a `timerCalc` function to perform\n// calculated timeout retries, such as exponential backoff.\n//\n// ## Examples\n//\n// let reconnectTimer = new Timer(() => this.connect(), function(tries){\n// return [1000, 5000, 10000][tries - 1] || 10000\n// })\n// reconnectTimer.scheduleTimeout() // fires after 1000\n// reconnectTimer.scheduleTimeout() // fires after 5000\n// reconnectTimer.reset()\n// reconnectTimer.scheduleTimeout() // fires after 1000\n//\n\nvar Timer = function () {\n function Timer(callback, timerCalc) {\n _classCallCheck(this, Timer);\n\n this.callback = callback;\n this.timerCalc = timerCalc;\n this.timer = null;\n this.tries = 0;\n }\n\n _createClass(Timer, [{\n key: \"reset\",\n value: function reset() {\n this.tries = 0;\n clearTimeout(this.timer);\n }\n\n // Cancels any previous scheduleTimeout and schedules callback\n\n }, {\n key: \"scheduleTimeout\",\n value: function scheduleTimeout() {\n var _this13 = this;\n\n clearTimeout(this.timer);\n\n this.timer = setTimeout(function () {\n _this13.tries = _this13.tries + 1;\n _this13.callback();\n }, this.timerCalc(this.tries + 1));\n }\n }]);\n\n return Timer;\n}();\n\n})(typeof(exports) === \"undefined\" ? window.Phoenix = window.Phoenix || {} : exports);\n })();\n});","\nrequire.register(\"phoenix_html/priv/static/phoenix_html.js\", function(exports, require, module) {\n require = __makeRelativeRequire(require, {}, \"phoenix_html\");\n (function() {\n 'use strict';\n\nfunction isLinkToSubmitParent(element) {\n var isLinkTag = element.tagName === 'A';\n var shouldSubmitParent = element.getAttribute('data-submit') === 'parent';\n\n return isLinkTag && shouldSubmitParent;\n}\n\nfunction didHandleSubmitLinkClick(element) {\n while (element && element.getAttribute) {\n if (isLinkToSubmitParent(element)) {\n var message = element.getAttribute('data-confirm');\n if (message === null || confirm(message)) {\n element.parentNode.submit();\n };\n return true;\n } else {\n element = element.parentNode;\n }\n }\n return false;\n}\n\n// for links with HTTP methods other than GET\nwindow.addEventListener('click', function (event) {\n if (event.target && didHandleSubmitLinkClick(event.target)) {\n event.preventDefault();\n return false;\n }\n}, false);\n })();\n});","\nrequire.register(\"rickshaw/rickshaw.js\", function(exports, require, module) {\n require = __makeRelativeRequire(require, {}, \"rickshaw\");\n (function() {\n (function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define(['d3'], function (d3) {\n return (root.Rickshaw = factory(d3));\n });\n } else if (typeof exports === 'object') {\n module.exports = factory(require('d3'));\n } else {\n root.Rickshaw = factory(d3);\n }\n}(this, function (d3) {\n/* jshint -W079 */\n\nvar Rickshaw = {\n\tversion: '1.6.3',\n\n\tnamespace: function(namespace, obj) {\n\n\t\tvar parts = namespace.split('.');\n\n\t\tvar parent = Rickshaw;\n\n\t\tfor(var i = 1, length = parts.length; i < length; i++) {\n\t\t\tvar currentPart = parts[i];\n\t\t\tparent[currentPart] = parent[currentPart] || {};\n\t\t\tparent = parent[currentPart];\n\t\t}\n\t\treturn parent;\n\t},\n\n\tkeys: function(obj) {\n\t\tvar keys = [];\n\t\tfor (var key in obj) keys.push(key);\n\t\treturn keys;\n\t},\n\n\textend: function(destination, source) {\n\n\t\tfor (var property in source) {\n\t\t\tdestination[property] = source[property];\n\t\t}\n\t\treturn destination;\n\t},\n\n\tclone: function(obj) {\n\t\treturn JSON.parse(JSON.stringify(obj));\n\t}\n};\n/* Adapted from https://github.com/Jakobo/PTClass */\n\n/*\nCopyright (c) 2005-2010 Sam Stephenson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n/* Based on Alex Arnell's inheritance implementation. */\n/** section: Language\n * class Class\n *\n * Manages Prototype's class-based OOP system.\n *\n * Refer to Prototype's web site for a [tutorial on classes and\n * inheritance](http://prototypejs.org/learn/class-inheritance).\n**/\n(function(globalContext) {\n/* ------------------------------------ */\n/* Import from object.js */\n/* ------------------------------------ */\nvar _toString = Object.prototype.toString,\n NULL_TYPE = 'Null',\n UNDEFINED_TYPE = 'Undefined',\n BOOLEAN_TYPE = 'Boolean',\n NUMBER_TYPE = 'Number',\n STRING_TYPE = 'String',\n OBJECT_TYPE = 'Object',\n FUNCTION_CLASS = '[object Function]';\nfunction isFunction(object) {\n return _toString.call(object) === FUNCTION_CLASS;\n}\nfunction extend(destination, source) {\n for (var property in source) if (source.hasOwnProperty(property)) // modify protect primitive slaughter\n destination[property] = source[property];\n return destination;\n}\nfunction keys(object) {\n if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); }\n var results = [];\n for (var property in object) {\n if (object.hasOwnProperty(property)) {\n results.push(property);\n }\n }\n return results;\n}\nfunction Type(o) {\n switch(o) {\n case null: return NULL_TYPE;\n case (void 0): return UNDEFINED_TYPE;\n }\n var type = typeof o;\n switch(type) {\n case 'boolean': return BOOLEAN_TYPE;\n case 'number': return NUMBER_TYPE;\n case 'string': return STRING_TYPE;\n }\n return OBJECT_TYPE;\n}\nfunction isUndefined(object) {\n return typeof object === \"undefined\";\n}\n/* ------------------------------------ */\n/* Import from Function.js */\n/* ------------------------------------ */\nvar slice = Array.prototype.slice;\nfunction argumentNames(fn) {\n var names = fn.toString().match(/^[\\s\\(]*function[^(]*\\(([^)]*)\\)/)[1]\n .replace(/\\/\\/.*?[\\r\\n]|\\/\\*(?:.|[\\r\\n])*?\\*\\//g, '')\n .replace(/\\s+/g, '').split(',');\n return names.length == 1 && !names[0] ? [] : names;\n}\nfunction wrap(fn, wrapper) {\n var __method = fn;\n return function() {\n var a = update([bind(__method, this)], arguments);\n return wrapper.apply(this, a);\n }\n}\nfunction update(array, args) {\n var arrayLength = array.length, length = args.length;\n while (length--) array[arrayLength + length] = args[length];\n return array;\n}\nfunction merge(array, args) {\n array = slice.call(array, 0);\n return update(array, args);\n}\nfunction bind(fn, context) {\n if (arguments.length < 2 && isUndefined(arguments[0])) return this;\n var __method = fn, args = slice.call(arguments, 2);\n return function() {\n var a = merge(args, arguments);\n return __method.apply(context, a);\n }\n}\n\n/* ------------------------------------ */\n/* Import from Prototype.js */\n/* ------------------------------------ */\nvar emptyFunction = function(){};\n\nvar Class = (function() {\n \n // Some versions of JScript fail to enumerate over properties, names of which \n // correspond to non-enumerable properties in the prototype chain\n var IS_DONTENUM_BUGGY = (function(){\n for (var p in { toString: 1 }) {\n // check actual property name, so that it works with augmented Object.prototype\n if (p === 'toString') return false;\n }\n return true;\n })();\n \n function subclass() {};\n function create() {\n var parent = null, properties = [].slice.apply(arguments);\n if (isFunction(properties[0]))\n parent = properties.shift();\n\n function klass() {\n this.initialize.apply(this, arguments);\n }\n\n extend(klass, Class.Methods);\n klass.superclass = parent;\n klass.subclasses = [];\n\n if (parent) {\n subclass.prototype = parent.prototype;\n klass.prototype = new subclass;\n try { parent.subclasses.push(klass) } catch(e) {}\n }\n\n for (var i = 0, length = properties.length; i < length; i++)\n klass.addMethods(properties[i]);\n\n if (!klass.prototype.initialize)\n klass.prototype.initialize = emptyFunction;\n\n klass.prototype.constructor = klass;\n return klass;\n }\n\n function addMethods(source) {\n var ancestor = this.superclass && this.superclass.prototype,\n properties = keys(source);\n\n // IE6 doesn't enumerate `toString` and `valueOf` (among other built-in `Object.prototype`) properties,\n // Force copy if they're not Object.prototype ones.\n // Do not copy other Object.prototype.* for performance reasons\n if (IS_DONTENUM_BUGGY) {\n if (source.toString != Object.prototype.toString)\n properties.push(\"toString\");\n if (source.valueOf != Object.prototype.valueOf)\n properties.push(\"valueOf\");\n }\n\n for (var i = 0, length = properties.length; i < length; i++) {\n var property = properties[i], value = source[property];\n if (ancestor && isFunction(value) &&\n argumentNames(value)[0] == \"$super\") {\n var method = value;\n value = wrap((function(m) {\n return function() { return ancestor[m].apply(this, arguments); };\n })(property), method);\n\n value.valueOf = bind(method.valueOf, method);\n value.toString = bind(method.toString, method);\n }\n this.prototype[property] = value;\n }\n\n return this;\n }\n\n return {\n create: create,\n Methods: {\n addMethods: addMethods\n }\n };\n})();\n\nif (globalContext.exports) {\n globalContext.exports.Class = Class;\n}\nelse {\n globalContext.Class = Class;\n}\n})(Rickshaw);\nRickshaw.namespace('Rickshaw.Compat.ClassList');\n\nRickshaw.Compat.ClassList = function() {\n\n\t/* adapted from http://purl.eligrey.com/github/classList.js/blob/master/classList.js */\n\n\tif (typeof document !== \"undefined\" && !(\"classList\" in document.createElement(\"a\"))) {\n\n\t(function (view) {\n\n\t\"use strict\";\n\n\tvar\n\t\t classListProp = \"classList\"\n\t\t, protoProp = \"prototype\"\n\t\t, elemCtrProto = (view.HTMLElement || view.Element)[protoProp]\n\t\t, objCtr = Object\n\t\t, strTrim = String[protoProp].trim || function () {\n\t\t\treturn this.replace(/^\\s+|\\s+$/g, \"\");\n\t\t}\n\t\t, arrIndexOf = Array[protoProp].indexOf || function (item) {\n\t\t\tvar\n\t\t\t\t i = 0\n\t\t\t\t, len = this.length\n\t\t\t;\n\t\t\tfor (; i < len; i++) {\n\t\t\t\tif (i in this && this[i] === item) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t}\n\t\t// Vendors: please allow content code to instantiate DOMExceptions\n\t\t, DOMEx = function (type, message) {\n\t\t\tthis.name = type;\n\t\t\tthis.code = DOMException[type];\n\t\t\tthis.message = message;\n\t\t}\n\t\t, checkTokenAndGetIndex = function (classList, token) {\n\t\t\tif (token === \"\") {\n\t\t\t\tthrow new DOMEx(\n\t\t\t\t\t \"SYNTAX_ERR\"\n\t\t\t\t\t, \"An invalid or illegal string was specified\"\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (/\\s/.test(token)) {\n\t\t\t\tthrow new DOMEx(\n\t\t\t\t\t \"INVALID_CHARACTER_ERR\"\n\t\t\t\t\t, \"String contains an invalid character\"\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn arrIndexOf.call(classList, token);\n\t\t}\n\t\t, ClassList = function (elem) {\n\t\t\tvar\n\t\t\t\t trimmedClasses = strTrim.call(elem.className)\n\t\t\t\t, classes = trimmedClasses ? trimmedClasses.split(/\\s+/) : []\n\t\t\t\t, i = 0\n\t\t\t\t, len = classes.length\n\t\t\t;\n\t\t\tfor (; i < len; i++) {\n\t\t\t\tthis.push(classes[i]);\n\t\t\t}\n\t\t\tthis._updateClassName = function () {\n\t\t\t\telem.className = this.toString();\n\t\t\t};\n\t\t}\n\t\t, classListProto = ClassList[protoProp] = []\n\t\t, classListGetter = function () {\n\t\t\treturn new ClassList(this);\n\t\t}\n\t;\n\t// Most DOMException implementations don't allow calling DOMException's toString()\n\t// on non-DOMExceptions. Error's toString() is sufficient here.\n\tDOMEx[protoProp] = Error[protoProp];\n\tclassListProto.item = function (i) {\n\t\treturn this[i] || null;\n\t};\n\tclassListProto.contains = function (token) {\n\t\ttoken += \"\";\n\t\treturn checkTokenAndGetIndex(this, token) !== -1;\n\t};\n\tclassListProto.add = function (token) {\n\t\ttoken += \"\";\n\t\tif (checkTokenAndGetIndex(this, token) === -1) {\n\t\t\tthis.push(token);\n\t\t\tthis._updateClassName();\n\t\t}\n\t};\n\tclassListProto.remove = function (token) {\n\t\ttoken += \"\";\n\t\tvar index = checkTokenAndGetIndex(this, token);\n\t\tif (index !== -1) {\n\t\t\tthis.splice(index, 1);\n\t\t\tthis._updateClassName();\n\t\t}\n\t};\n\tclassListProto.toggle = function (token) {\n\t\ttoken += \"\";\n\t\tif (checkTokenAndGetIndex(this, token) === -1) {\n\t\t\tthis.add(token);\n\t\t} else {\n\t\t\tthis.remove(token);\n\t\t}\n\t};\n\tclassListProto.toString = function () {\n\t\treturn this.join(\" \");\n\t};\n\n\tif (objCtr.defineProperty) {\n\t\tvar classListPropDesc = {\n\t\t\t get: classListGetter\n\t\t\t, enumerable: true\n\t\t\t, configurable: true\n\t\t};\n\t\ttry {\n\t\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t\t} catch (ex) { // IE 8 doesn't support enumerable:true\n\t\t\tif (ex.number === -0x7FF5EC54) {\n\t\t\t\tclassListPropDesc.enumerable = false;\n\t\t\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t\t\t}\n\t\t}\n\t} else if (objCtr[protoProp].__defineGetter__) {\n\t\telemCtrProto.__defineGetter__(classListProp, classListGetter);\n\t}\n\n\t}(window));\n\n\t}\n};\n\nif ( (typeof RICKSHAW_NO_COMPAT !== \"undefined\" && !RICKSHAW_NO_COMPAT) || typeof RICKSHAW_NO_COMPAT === \"undefined\") {\n\tnew Rickshaw.Compat.ClassList();\n}\nRickshaw.namespace('Rickshaw.Graph');\n\nRickshaw.Graph = function(args) {\n\n\tvar self = this;\n\n\tthis.initialize = function(args) {\n\n\t\tif (!args.element) throw \"Rickshaw.Graph needs a reference to an element\";\n\t\tif (args.element.nodeType !== 1) throw \"Rickshaw.Graph element was defined but not an HTML element\";\n\n\t\tthis.element = args.element;\n\t\tthis.series = args.series;\n\t\tthis.window = {};\n\n\t\tthis.updateCallbacks = [];\n\t\tthis.configureCallbacks = [];\n\n\t\tthis.defaults = {\n\t\t\tinterpolation: 'cardinal',\n\t\t\toffset: 'zero',\n\t\t\tmin: undefined,\n\t\t\tmax: undefined,\n\t\t\tpreserve: false,\n\t\t\txScale: undefined,\n\t\t\tyScale: undefined,\n\t\t\tstack: true\n\t\t};\n\n\t\tthis._loadRenderers();\n\t\tthis.configure(args);\n\t\tthis.validateSeries(args.series);\n\n\t\tthis.series.active = function() { return self.series.filter( function(s) { return !s.disabled } ) };\n\t\tthis.setSize({ width: args.width, height: args.height });\n\t\tthis.element.classList.add('rickshaw_graph');\n\n\t\tthis.vis = d3.select(this.element)\n\t\t\t.append(\"svg:svg\")\n\t\t\t.attr('width', this.width)\n\t\t\t.attr('height', this.height);\n\n\t\tthis.discoverRange();\n\t};\n\n\tthis._loadRenderers = function() {\n\n\t\tfor (var name in Rickshaw.Graph.Renderer) {\n\t\t\tif (!name || !Rickshaw.Graph.Renderer.hasOwnProperty(name)) continue;\n\t\t\tvar r = Rickshaw.Graph.Renderer[name];\n\t\t\tif (!r || !r.prototype || !r.prototype.render) continue;\n\t\t\tself.registerRenderer(new r( { graph: self } ));\n\t\t}\n\t};\n\n\tthis.validateSeries = function(series) {\n\n\t\tif (!Array.isArray(series) && !(series instanceof Rickshaw.Series)) {\n\t\t\tvar seriesSignature = Object.prototype.toString.apply(series);\n\t\t\tthrow \"series is not an array: \" + seriesSignature;\n\t\t}\n\n\t\tvar pointsCount;\n\n\t\tseries.forEach( function(s) {\n\n\t\t\tif (!(s instanceof Object)) {\n\t\t\t\tthrow \"series element is not an object: \" + s;\n\t\t\t}\n\t\t\tif (!(s.data)) {\n\t\t\t\tthrow \"series has no data: \" + JSON.stringify(s);\n\t\t\t}\n\t\t\tif (!Array.isArray(s.data)) {\n\t\t\t\tthrow \"series data is not an array: \" + JSON.stringify(s.data);\n\t\t\t}\n\t\t\t\n\t\t\tif (s.data.length > 0) {\n\t\t\t\tvar x = s.data[0].x;\n\t\t\t\tvar y = s.data[0].y;\n\n\t\t\t\tif (typeof x != 'number' || ( typeof y != 'number' && y !== null ) ) {\n\t\t\t\t\tthrow \"x and y properties of points should be numbers instead of \" +\n\t\t\t\t\t\t(typeof x) + \" and \" + (typeof y);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (s.data.length >= 3) {\n\t\t\t\t// probe to sanity check sort order\n\t\t\t\tif (s.data[2].x < s.data[1].x || s.data[1].x < s.data[0].x || s.data[s.data.length - 1].x < s.data[0].x) {\n\t\t\t\t\tthrow \"series data needs to be sorted on x values for series name: \" + s.name;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}, this );\n\t};\n\n\tthis.dataDomain = function() {\n\n\t\tvar data = this.series.map( function(s) { return s.data } );\n\n\t\tvar min = d3.min( data.map( function(d) { return d[0].x } ) );\n\t\tvar max = d3.max( data.map( function(d) { return d[d.length - 1].x } ) );\n\n\t\treturn [min, max];\n\t};\n\n\tthis.discoverRange = function() {\n\n\t\tvar domain = this.renderer.domain();\n\n\t\t// this.*Scale is coming from the configuration dictionary\n\t\t// which may be referenced by the Graph creator, or shared\n\t\t// with other Graphs. We need to ensure we copy the scale\n\t\t// so that our mutations do not change the object given to us.\n\t\t// Hence the .copy()\n\t\tthis.x = (this.xScale || d3.scale.linear()).copy().domain(domain.x).range([0, this.width]);\n\t\tthis.y = (this.yScale || d3.scale.linear()).copy().domain(domain.y).range([this.height, 0]);\n\n\t\tthis.x.magnitude = d3.scale.linear()\n\t\t\t.domain([domain.x[0] - domain.x[0], domain.x[1] - domain.x[0]])\n\t\t\t.range([0, this.width]);\n\n\t\tthis.y.magnitude = d3.scale.linear()\n\t\t\t.domain([domain.y[0] - domain.y[0], domain.y[1] - domain.y[0]])\n\t\t\t.range([0, this.height]);\n\t};\n\n\tthis.render = function() {\n\n\t\tvar stackedData = this.stackData();\n\t\tthis.discoverRange();\n\n\t\tthis.renderer.render();\n\n\t\tthis.updateCallbacks.forEach( function(callback) {\n\t\t\tcallback();\n\t\t} );\n\n\t};\n\n\tthis.update = this.render;\n\n\tthis.stackData = function() {\n\n\t\tvar data = this.series.active()\n\t\t\t.map( function(d) { return d.data } )\n\t\t\t.map( function(d) { return d.filter( function(d) { return this._slice(d) }, this ) }, this);\n\n\t\tvar preserve = this.preserve;\n\t\tif (!preserve) {\n\t\t\tthis.series.forEach( function(series) {\n\t\t\t\tif (series.scale) {\n\t\t\t\t\t// data must be preserved when a scale is used\n\t\t\t\t\tpreserve = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tdata = preserve ? Rickshaw.clone(data) : data;\n\n\t\tthis.series.active().forEach( function(series, index) {\n\t\t\tif (series.scale) {\n\t\t\t\t// apply scale to each series\n\t\t\t\tvar seriesData = data[index];\n\t\t\t\tif(seriesData) {\n\t\t\t\t\tseriesData.forEach( function(d) {\n\t\t\t\t\t\td.y = series.scale(d.y);\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tthis.stackData.hooks.data.forEach( function(entry) {\n\t\t\tdata = entry.f.apply(self, [data]);\n\t\t} );\n\n\t\tvar stackedData;\n\n\t\tif (!this.renderer.unstack) {\n\n\t\t\tthis._validateStackable();\n\n\t\t\tvar layout = d3.layout.stack();\n\t\t\tlayout.offset( self.offset );\n\t\t\tstackedData = layout(data);\n\t\t}\n\n\t\tstackedData = stackedData || data;\n\n\t\tif (this.renderer.unstack) {\n\t\t\tstackedData.forEach( function(seriesData) {\n\t\t\t\tseriesData.forEach( function(d) {\n\t\t\t\t\td.y0 = d.y0 === undefined ? 0 : d.y0;\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\n\t\tthis.stackData.hooks.after.forEach( function(entry) {\n\t\t\tstackedData = entry.f.apply(self, [data]);\n\t\t} );\n\n\t\tvar i = 0;\n\t\tthis.series.forEach( function(series) {\n\t\t\tif (series.disabled) return;\n\t\t\tseries.stack = stackedData[i++];\n\t\t} );\n\n\t\tthis.stackedData = stackedData;\n\t\treturn stackedData;\n\t};\n\n\tthis._validateStackable = function() {\n\n\t\tvar series = this.series;\n\t\tvar pointsCount;\n\n\t\tseries.forEach( function(s) {\n\n\t\t\tpointsCount = pointsCount || s.data.length;\n\n\t\t\tif (pointsCount && s.data.length != pointsCount) {\n\t\t\t\tthrow \"stacked series cannot have differing numbers of points: \" +\n\t\t\t\t\tpointsCount + \" vs \" + s.data.length + \"; see Rickshaw.Series.fill()\";\n\t\t\t}\n\n\t\t}, this );\n\t};\n\n\tthis.stackData.hooks = { data: [], after: [] };\n\n\tthis._slice = function(d) {\n\n\t\tif (this.window.xMin || this.window.xMax) {\n\n\t\t\tvar isInRange = true;\n\n\t\t\tif (this.window.xMin && d.x < this.window.xMin) isInRange = false;\n\t\t\tif (this.window.xMax && d.x > this.window.xMax) isInRange = false;\n\n\t\t\treturn isInRange;\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tthis.onUpdate = function(callback) {\n\t\tthis.updateCallbacks.push(callback);\n\t};\n\n\tthis.onConfigure = function(callback) {\n\t\tthis.configureCallbacks.push(callback);\n\t};\n\n\tthis.registerRenderer = function(renderer) {\n\t\tthis._renderers = this._renderers || {};\n\t\tthis._renderers[renderer.name] = renderer;\n\t};\n\n\tthis.configure = function(args) {\n\n\t\tthis.config = this.config || {};\n\n\t\tif (args.width || args.height) {\n\t\t\tthis.setSize(args);\n\t\t}\n\n\t\tRickshaw.keys(this.defaults).forEach( function(k) {\n\t\t\tthis.config[k] = k in args ? args[k]\n\t\t\t\t: k in this ? this[k]\n\t\t\t\t: this.defaults[k];\n\t\t}, this );\n\n\t\tRickshaw.keys(this.config).forEach( function(k) {\n\t\t\tthis[k] = this.config[k];\n\t\t}, this );\n\n\t\tif ('stack' in args) args.unstack = !args.stack;\n\n\t\tvar renderer = args.renderer || (this.renderer && this.renderer.name) || 'stack';\n\t\tthis.setRenderer(renderer, args);\n\n\t\tthis.configureCallbacks.forEach( function(callback) {\n\t\t\tcallback(args);\n\t\t} );\n\t};\n\n\tthis.setRenderer = function(r, args) {\n\t\tif (typeof r == 'function') {\n\t\t\tthis.renderer = new r( { graph: self } );\n\t\t\tthis.registerRenderer(this.renderer);\n\t\t} else {\n\t\t\tif (!this._renderers[r]) {\n\t\t\t\tthrow \"couldn't find renderer \" + r;\n\t\t\t}\n\t\t\tthis.renderer = this._renderers[r];\n\t\t}\n\n\t\tif (typeof args == 'object') {\n\t\t\tthis.renderer.configure(args);\n\t\t}\n\t};\n\n\tthis.setSize = function(args) {\n\n\t\targs = args || {};\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\tvar style = window.getComputedStyle(this.element, null);\n\t\t\tvar elementWidth = parseInt(style.getPropertyValue('width'), 10);\n\t\t\tvar elementHeight = parseInt(style.getPropertyValue('height'), 10);\n\t\t}\n\n\t\tthis.width = args.width || elementWidth || 400;\n\t\tthis.height = args.height || elementHeight || 250;\n\n\t\tthis.vis && this.vis\n\t\t\t.attr('width', this.width)\n\t\t\t.attr('height', this.height);\n\t};\n\n\tthis.initialize(args);\n};\nRickshaw.namespace('Rickshaw.Fixtures.Color');\n\nRickshaw.Fixtures.Color = function() {\n\n\tthis.schemes = {};\n\n\tthis.schemes.spectrum14 = [\n\t\t'#ecb796',\n\t\t'#dc8f70',\n\t\t'#b2a470',\n\t\t'#92875a',\n\t\t'#716c49',\n\t\t'#d2ed82',\n\t\t'#bbe468',\n\t\t'#a1d05d',\n\t\t'#e7cbe6',\n\t\t'#d8aad6',\n\t\t'#a888c2',\n\t\t'#9dc2d3',\n\t\t'#649eb9',\n\t\t'#387aa3'\n\t].reverse();\n\n\tthis.schemes.spectrum2000 = [\n\t\t'#57306f',\n\t\t'#514c76',\n\t\t'#646583',\n\t\t'#738394',\n\t\t'#6b9c7d',\n\t\t'#84b665',\n\t\t'#a7ca50',\n\t\t'#bfe746',\n\t\t'#e2f528',\n\t\t'#fff726',\n\t\t'#ecdd00',\n\t\t'#d4b11d',\n\t\t'#de8800',\n\t\t'#de4800',\n\t\t'#c91515',\n\t\t'#9a0000',\n\t\t'#7b0429',\n\t\t'#580839',\n\t\t'#31082b'\n\t];\n\n\tthis.schemes.spectrum2001 = [\n\t\t'#2f243f',\n\t\t'#3c2c55',\n\t\t'#4a3768',\n\t\t'#565270',\n\t\t'#6b6b7c',\n\t\t'#72957f',\n\t\t'#86ad6e',\n\t\t'#a1bc5e',\n\t\t'#b8d954',\n\t\t'#d3e04e',\n\t\t'#ccad2a',\n\t\t'#cc8412',\n\t\t'#c1521d',\n\t\t'#ad3821',\n\t\t'#8a1010',\n\t\t'#681717',\n\t\t'#531e1e',\n\t\t'#3d1818',\n\t\t'#320a1b'\n\t];\n\n\tthis.schemes.classic9 = [\n\t\t'#423d4f',\n\t\t'#4a6860',\n\t\t'#848f39',\n\t\t'#a2b73c',\n\t\t'#ddcb53',\n\t\t'#c5a32f',\n\t\t'#7d5836',\n\t\t'#963b20',\n\t\t'#7c2626',\n\t\t'#491d37',\n\t\t'#2f254a'\n\t].reverse();\n\n\tthis.schemes.httpStatus = {\n\t\t503: '#ea5029',\n\t\t502: '#d23f14',\n\t\t500: '#bf3613',\n\t\t410: '#efacea',\n\t\t409: '#e291dc',\n\t\t403: '#f457e8',\n\t\t408: '#e121d2',\n\t\t401: '#b92dae',\n\t\t405: '#f47ceb',\n\t\t404: '#a82a9f',\n\t\t400: '#b263c6',\n\t\t301: '#6fa024',\n\t\t302: '#87c32b',\n\t\t307: '#a0d84c',\n\t\t304: '#28b55c',\n\t\t200: '#1a4f74',\n\t\t206: '#27839f',\n\t\t201: '#52adc9',\n\t\t202: '#7c979f',\n\t\t203: '#a5b8bd',\n\t\t204: '#c1cdd1'\n\t};\n\n\tthis.schemes.colorwheel = [\n\t\t'#b5b6a9',\n\t\t'#858772',\n\t\t'#785f43',\n\t\t'#96557e',\n\t\t'#4682b4',\n\t\t'#65b9ac',\n\t\t'#73c03a',\n\t\t'#cb513a'\n\t].reverse();\n\n\tthis.schemes.cool = [\n\t\t'#5e9d2f',\n\t\t'#73c03a',\n\t\t'#4682b4',\n\t\t'#7bc3b8',\n\t\t'#a9884e',\n\t\t'#c1b266',\n\t\t'#a47493',\n\t\t'#c09fb5'\n\t];\n\n\tthis.schemes.munin = [\n\t\t'#00cc00',\n\t\t'#0066b3',\n\t\t'#ff8000',\n\t\t'#ffcc00',\n\t\t'#330099',\n\t\t'#990099',\n\t\t'#ccff00',\n\t\t'#ff0000',\n\t\t'#808080',\n\t\t'#008f00',\n\t\t'#00487d',\n\t\t'#b35a00',\n\t\t'#b38f00',\n\t\t'#6b006b',\n\t\t'#8fb300',\n\t\t'#b30000',\n\t\t'#bebebe',\n\t\t'#80ff80',\n\t\t'#80c9ff',\n\t\t'#ffc080',\n\t\t'#ffe680',\n\t\t'#aa80ff',\n\t\t'#ee00cc',\n\t\t'#ff8080',\n\t\t'#666600',\n\t\t'#ffbfff',\n\t\t'#00ffcc',\n\t\t'#cc6699',\n\t\t'#999900'\n\t];\n};\nRickshaw.namespace('Rickshaw.Fixtures.RandomData');\n\nRickshaw.Fixtures.RandomData = function(timeInterval) {\n\n\tvar addData;\n\ttimeInterval = timeInterval || 1;\n\n\tvar lastRandomValue = 200;\n\n\tvar timeBase = Math.floor(new Date().getTime() / 1000);\n\n\tthis.addData = function(data) {\n\n\t\tvar randomValue = Math.random() * 100 + 15 + lastRandomValue;\n\t\tvar index = data[0].length;\n\n\t\tvar counter = 1;\n\n\t\tdata.forEach( function(series) {\n\t\t\tvar randomVariance = Math.random() * 20;\n\t\t\tvar v = randomValue / 25 + counter++ +\n\t\t\t\t(Math.cos((index * counter * 11) / 960) + 2) * 15 +\n\t\t\t\t(Math.cos(index / 7) + 2) * 7 +\n\t\t\t\t(Math.cos(index / 17) + 2) * 1;\n\n\t\t\tseries.push( { x: (index * timeInterval) + timeBase, y: v + randomVariance } );\n\t\t} );\n\n\t\tlastRandomValue = randomValue * 0.85;\n\t};\n\n\tthis.removeData = function(data) {\n\t\tdata.forEach( function(series) {\n\t\t\tseries.shift();\n\t\t} );\n\t\ttimeBase += timeInterval;\n\t};\n};\n\nRickshaw.namespace('Rickshaw.Fixtures.Time');\n\nRickshaw.Fixtures.Time = function() {\n\n\tvar self = this;\n\n\tthis.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n\tthis.units = [\n\t\t{\n\t\t\tname: 'decade',\n\t\t\tseconds: 86400 * 365.25 * 10,\n\t\t\tformatter: function(d) { return (parseInt(d.getUTCFullYear() / 10, 10) * 10) }\n\t\t}, {\n\t\t\tname: 'year',\n\t\t\tseconds: 86400 * 365.25,\n\t\t\tformatter: function(d) { return d.getUTCFullYear() }\n\t\t}, {\n\t\t\tname: 'month',\n\t\t\tseconds: 86400 * 30.5,\n\t\t\tformatter: function(d) { return self.months[d.getUTCMonth()] }\n\t\t}, {\n\t\t\tname: 'week',\n\t\t\tseconds: 86400 * 7,\n\t\t\tformatter: function(d) { return self.formatDate(d) }\n\t\t}, {\n\t\t\tname: 'day',\n\t\t\tseconds: 86400,\n\t\t\tformatter: function(d) { return d.getUTCDate() }\n\t\t}, {\n\t\t\tname: '6 hour',\n\t\t\tseconds: 3600 * 6,\n\t\t\tformatter: function(d) { return self.formatTime(d) }\n\t\t}, {\n\t\t\tname: 'hour',\n\t\t\tseconds: 3600,\n\t\t\tformatter: function(d) { return self.formatTime(d) }\n\t\t}, {\n\t\t\tname: '15 minute',\n\t\t\tseconds: 60 * 15,\n\t\t\tformatter: function(d) { return self.formatTime(d) }\n\t\t}, {\n\t\t\tname: 'minute',\n\t\t\tseconds: 60,\n\t\t\tformatter: function(d) { return d.getUTCMinutes() + 'm' }\n\t\t}, {\n\t\t\tname: '15 second',\n\t\t\tseconds: 15,\n\t\t\tformatter: function(d) { return d.getUTCSeconds() + 's' }\n\t\t}, {\n\t\t\tname: 'second',\n\t\t\tseconds: 1,\n\t\t\tformatter: function(d) { return d.getUTCSeconds() + 's' }\n\t\t}, {\n\t\t\tname: 'decisecond',\n\t\t\tseconds: 1/10,\n\t\t\tformatter: function(d) { return d.getUTCMilliseconds() + 'ms' }\n\t\t}, {\n\t\t\tname: 'centisecond',\n\t\t\tseconds: 1/100,\n\t\t\tformatter: function(d) { return d.getUTCMilliseconds() + 'ms' }\n\t\t}\n\t];\n\n\tthis.unit = function(unitName) {\n\t\treturn this.units.filter( function(unit) { return unitName == unit.name } ).shift();\n\t};\n\n\tthis.formatDate = function(d) {\n\t\treturn d3.time.format('%b %e')(d);\n\t};\n\n\tthis.formatTime = function(d) {\n\t\treturn d.toUTCString().match(/(\\d+:\\d+):/)[1];\n\t};\n\n\tthis.ceil = function(time, unit) {\n\n\t\tvar date, floor, year;\n\n\t\tif (unit.name == 'month') {\n\n\t\t\tdate = new Date(time * 1000);\n\n\t\t\tfloor = Date.UTC(date.getUTCFullYear(), date.getUTCMonth()) / 1000;\n\t\t\tif (floor == time) return time;\n\n\t\t\tyear = date.getUTCFullYear();\n\t\t\tvar month = date.getUTCMonth();\n\n\t\t\tif (month == 11) {\n\t\t\t\tmonth = 0;\n\t\t\t\tyear = year + 1;\n\t\t\t} else {\n\t\t\t\tmonth += 1;\n\t\t\t}\n\n\t\t\treturn Date.UTC(year, month) / 1000;\n\t\t}\n\n\t\tif (unit.name == 'year') {\n\n\t\t\tdate = new Date(time * 1000);\n\n\t\t\tfloor = Date.UTC(date.getUTCFullYear(), 0) / 1000;\n\t\t\tif (floor == time) return time;\n\n\t\t\tyear = date.getUTCFullYear() + 1;\n\n\t\t\treturn Date.UTC(year, 0) / 1000;\n\t\t}\n\n\t\treturn Math.ceil(time / unit.seconds) * unit.seconds;\n\t};\n};\nRickshaw.namespace('Rickshaw.Fixtures.Time.Local');\n\nRickshaw.Fixtures.Time.Local = function() {\n\n\tvar self = this;\n\n\tthis.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n\tthis.units = [\n\t\t{\n\t\t\tname: 'decade',\n\t\t\tseconds: 86400 * 365.25 * 10,\n\t\t\tformatter: function(d) { return (parseInt(d.getFullYear() / 10, 10) * 10) }\n\t\t}, {\n\t\t\tname: 'year',\n\t\t\tseconds: 86400 * 365.25,\n\t\t\tformatter: function(d) { return d.getFullYear() }\n\t\t}, {\n\t\t\tname: 'month',\n\t\t\tseconds: 86400 * 30.5,\n\t\t\tformatter: function(d) { return self.months[d.getMonth()] }\n\t\t}, {\n\t\t\tname: 'week',\n\t\t\tseconds: 86400 * 7,\n\t\t\tformatter: function(d) { return self.formatDate(d) }\n\t\t}, {\n\t\t\tname: 'day',\n\t\t\tseconds: 86400,\n\t\t\tformatter: function(d) { return d.getDate() }\n\t\t}, {\n\t\t\tname: '6 hour',\n\t\t\tseconds: 3600 * 6,\n\t\t\tformatter: function(d) { return self.formatTime(d) }\n\t\t}, {\n\t\t\tname: 'hour',\n\t\t\tseconds: 3600,\n\t\t\tformatter: function(d) { return self.formatTime(d) }\n\t\t}, {\n\t\t\tname: '15 minute',\n\t\t\tseconds: 60 * 15,\n\t\t\tformatter: function(d) { return self.formatTime(d) }\n\t\t}, {\n\t\t\tname: 'minute',\n\t\t\tseconds: 60,\n\t\t\tformatter: function(d) { return d.getMinutes() }\n\t\t}, {\n\t\t\tname: '15 second',\n\t\t\tseconds: 15,\n\t\t\tformatter: function(d) { return d.getSeconds() + 's' }\n\t\t}, {\n\t\t\tname: 'second',\n\t\t\tseconds: 1,\n\t\t\tformatter: function(d) { return d.getSeconds() + 's' }\n\t\t}, {\n\t\t\tname: 'decisecond',\n\t\t\tseconds: 1/10,\n\t\t\tformatter: function(d) { return d.getMilliseconds() + 'ms' }\n\t\t}, {\n\t\t\tname: 'centisecond',\n\t\t\tseconds: 1/100,\n\t\t\tformatter: function(d) { return d.getMilliseconds() + 'ms' }\n\t\t}\n\t];\n\n\tthis.unit = function(unitName) {\n\t\treturn this.units.filter( function(unit) { return unitName == unit.name } ).shift();\n\t};\n\n\tthis.formatDate = function(d) {\n\t\treturn d3.time.format('%b %e')(d);\n\t};\n\n\tthis.formatTime = function(d) {\n\t\treturn d.toString().match(/(\\d+:\\d+):/)[1];\n\t};\n\n\tthis.ceil = function(time, unit) {\n\n\t\tvar date, floor, year, offset;\n\n\t\tif (unit.name == 'day') {\n\n\t\t\tvar nearFuture = new Date((time + unit.seconds - 1) * 1000);\n\n\t\t\tvar rounded = new Date(0);\n\t\t\trounded.setFullYear(nearFuture.getFullYear());\n\t\t\trounded.setMonth(nearFuture.getMonth());\n\t\t\trounded.setDate(nearFuture.getDate());\n\t\t\trounded.setMilliseconds(0);\n\t\t\trounded.setSeconds(0);\n\t\t\trounded.setMinutes(0);\n\t\t\trounded.setHours(0);\n\n\t\t\treturn rounded.getTime() / 1000;\n\t\t}\n\n\t\tif (unit.name == 'month') {\n\n\t\t\tdate = new Date(time * 1000);\n\n\t\t\tfloor = new Date(date.getFullYear(), date.getMonth()).getTime() / 1000;\n\t\t\tif (floor == time) return time;\n\n\t\t\tyear = date.getFullYear();\n\t\t\tvar month = date.getMonth();\n\n\t\t\tif (month == 11) {\n\t\t\t\tmonth = 0;\n\t\t\t\tyear = year + 1;\n\t\t\t} else {\n\t\t\t\tmonth += 1;\n\t\t\t}\n\n\t\t\treturn new Date(year, month).getTime() / 1000;\n\t\t}\n\n\t\tif (unit.name == 'year') {\n\n\t\t\tdate = new Date(time * 1000);\n\n\t\t\tfloor = new Date(date.getUTCFullYear(), 0).getTime() / 1000;\n\t\t\tif (floor == time) return time;\n\n\t\t\tyear = date.getFullYear() + 1;\n\n\t\t\treturn new Date(year, 0).getTime() / 1000;\n\t\t}\n\t\toffset = new Date(time * 1000).getTimezoneOffset() * 60;\n\t\treturn Math.ceil((time - offset) / unit.seconds) * unit.seconds + offset;\n\t};\n};\nRickshaw.namespace('Rickshaw.Fixtures.Number');\n\nRickshaw.Fixtures.Number.formatKMBT = function(y) {\n\tvar abs_y = Math.abs(y);\n\tif (abs_y >= 1000000000000) { return y / 1000000000000 + \"T\" }\n\telse if (abs_y >= 1000000000) { return y / 1000000000 + \"B\" }\n\telse if (abs_y >= 1000000) { return y / 1000000 + \"M\" }\n\telse if (abs_y >= 1000) { return y / 1000 + \"K\" }\n\telse if (abs_y < 1 && abs_y > 0) { return y.toFixed(2) }\n\telse if (abs_y === 0) { return '' }\n\telse { return y }\n};\n\nRickshaw.Fixtures.Number.formatBase1024KMGTP = function(y) {\n var abs_y = Math.abs(y);\n if (abs_y >= 1125899906842624) { return y / 1125899906842624 + \"P\" }\n else if (abs_y >= 1099511627776){ return y / 1099511627776 + \"T\" }\n else if (abs_y >= 1073741824) { return y / 1073741824 + \"G\" }\n else if (abs_y >= 1048576) { return y / 1048576 + \"M\" }\n else if (abs_y >= 1024) { return y / 1024 + \"K\" }\n else if (abs_y < 1 && abs_y > 0) { return y.toFixed(2) }\n else if (abs_y === 0) { return '' }\n else { return y }\n};\nRickshaw.namespace(\"Rickshaw.Color.Palette\");\n\nRickshaw.Color.Palette = function(args) {\n\n\tvar color = new Rickshaw.Fixtures.Color();\n\n\targs = args || {};\n\tthis.schemes = {};\n\n\tthis.scheme = color.schemes[args.scheme] || args.scheme || color.schemes.colorwheel;\n\tthis.runningIndex = 0;\n\tthis.generatorIndex = 0;\n\n\tif (args.interpolatedStopCount) {\n\t\tvar schemeCount = this.scheme.length - 1;\n\t\tvar i, j, scheme = [];\n\t\tfor (i = 0; i < schemeCount; i++) {\n\t\t\tscheme.push(this.scheme[i]);\n\t\t\tvar generator = d3.interpolateHsl(this.scheme[i], this.scheme[i + 1]);\n\t\t\tfor (j = 1; j < args.interpolatedStopCount; j++) {\n\t\t\t\tscheme.push(generator((1 / args.interpolatedStopCount) * j));\n\t\t\t}\n\t\t}\n\t\tscheme.push(this.scheme[this.scheme.length - 1]);\n\t\tthis.scheme = scheme;\n\t}\n\tthis.rotateCount = this.scheme.length;\n\n\tthis.color = function(key) {\n\t\treturn this.scheme[key] || this.scheme[this.runningIndex++] || this.interpolateColor() || '#808080';\n\t};\n\n\tthis.interpolateColor = function() {\n\t\tif (!Array.isArray(this.scheme)) return;\n\t\tvar color;\n\t\tif (this.generatorIndex == this.rotateCount * 2 - 1) {\n\t\t\tcolor = d3.interpolateHsl(this.scheme[this.generatorIndex], this.scheme[0])(0.5);\n\t\t\tthis.generatorIndex = 0;\n\t\t\tthis.rotateCount *= 2;\n\t\t} else {\n\t\t\tcolor = d3.interpolateHsl(this.scheme[this.generatorIndex], this.scheme[this.generatorIndex + 1])(0.5);\n\t\t\tthis.generatorIndex++;\n\t\t}\n\t\tthis.scheme.push(color);\n\t\treturn color;\n\t};\n\n};\nRickshaw.namespace('Rickshaw.Graph.Ajax');\n\nRickshaw.Graph.Ajax = Rickshaw.Class.create( {\n\n\tinitialize: function(args) {\n\n\t\tthis.dataURL = args.dataURL;\n\n\t\tthis.onData = args.onData || function(d) { return d };\n\t\tthis.onComplete = args.onComplete || function() {};\n\t\tthis.onError = args.onError || function() {};\n\n\t\tthis.args = args; // pass through to Rickshaw.Graph\n\n\t\tthis.request();\n\t},\n\n\trequest: function() {\n\n\t\tjQuery.ajax( {\n\t\t\turl: this.dataURL,\n\t\t\tdataType: 'json',\n\t\t\tsuccess: this.success.bind(this),\n\t\t\terror: this.error.bind(this)\n\t\t} );\n\t},\n\n\terror: function() {\n\n\t\tconsole.log(\"error loading dataURL: \" + this.dataURL);\n\t\tthis.onError(this);\n\t},\n\n\tsuccess: function(data, status) {\n\n\t\tdata = this.onData(data);\n\t\tthis.args.series = this._splice({ data: data, series: this.args.series });\n\n\t\tthis.graph = this.graph || new Rickshaw.Graph(this.args);\n\t\tthis.graph.render();\n\n\t\tthis.onComplete(this);\n\t},\n\n\t_splice: function(args) {\n\n\t\tvar data = args.data;\n\t\tvar series = args.series;\n\n\t\tif (!args.series) return data;\n\n\t\tseries.forEach( function(s) {\n\n\t\t\tvar seriesKey = s.key || s.name;\n\t\t\tif (!seriesKey) throw \"series needs a key or a name\";\n\n\t\t\tdata.forEach( function(d) {\n\n\t\t\t\tvar dataKey = d.key || d.name;\n\t\t\t\tif (!dataKey) throw \"data needs a key or a name\";\n\n\t\t\t\tif (seriesKey == dataKey) {\n\t\t\t\t\tvar properties = ['color', 'name', 'data'];\n\t\t\t\t\tproperties.forEach( function(p) {\n\t\t\t\t\t\tif (d[p]) s[p] = d[p];\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\treturn series;\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.Annotate');\n\nRickshaw.Graph.Annotate = function(args) {\n\n\tvar graph = this.graph = args.graph;\n\tthis.elements = { timeline: args.element };\n\t\n\tvar self = this;\n\n\tthis.data = {};\n\n\tthis.elements.timeline.classList.add('rickshaw_annotation_timeline');\n\n\tthis.add = function(time, content, end_time) {\n\t\tself.data[time] = self.data[time] || {'boxes': []};\n\t\tself.data[time].boxes.push({content: content, end: end_time});\n\t};\n\n\tthis.update = function() {\n\n\t\tRickshaw.keys(self.data).forEach( function(time) {\n\n\t\t\tvar annotation = self.data[time];\n\t\t\tvar left = self.graph.x(time);\n\n\t\t\tif (left < 0 || left > self.graph.x.range()[1]) {\n\t\t\t\tif (annotation.element) {\n\t\t\t\t\tannotation.line.classList.add('offscreen');\n\t\t\t\t\tannotation.element.style.display = 'none';\n\t\t\t\t}\n\n\t\t\t\tannotation.boxes.forEach( function(box) {\n\t\t\t\t\tif ( box.rangeElement ) box.rangeElement.classList.add('offscreen');\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!annotation.element) {\n\t\t\t\tvar element = annotation.element = document.createElement('div');\n\t\t\t\telement.classList.add('annotation');\n\t\t\t\tthis.elements.timeline.appendChild(element);\n\t\t\t\telement.addEventListener('click', function(e) {\n\t\t\t\t\telement.classList.toggle('active');\n\t\t\t\t\tannotation.line.classList.toggle('active');\n\t\t\t\t\tannotation.boxes.forEach( function(box) {\n\t\t\t\t\t\tif ( box.rangeElement ) box.rangeElement.classList.toggle('active');\n\t\t\t\t\t});\n\t\t\t\t}, false);\n\t\t\t\t\t\n\t\t\t}\n\n\t\t\tannotation.element.style.left = left + 'px';\n\t\t\tannotation.element.style.display = 'block';\n\n\t\t\tannotation.boxes.forEach( function(box) {\n\n\n\t\t\t\tvar element = box.element;\n\n\t\t\t\tif (!element) {\n\t\t\t\t\telement = box.element = document.createElement('div');\n\t\t\t\t\telement.classList.add('content');\n\t\t\t\t\telement.innerHTML = box.content;\n\t\t\t\t\tannotation.element.appendChild(element);\n\n\t\t\t\t\tannotation.line = document.createElement('div');\n\t\t\t\t\tannotation.line.classList.add('annotation_line');\n\t\t\t\t\tself.graph.element.appendChild(annotation.line);\n\n\t\t\t\t\tif ( box.end ) {\n\t\t\t\t\t\tbox.rangeElement = document.createElement('div');\n\t\t\t\t\t\tbox.rangeElement.classList.add('annotation_range');\n\t\t\t\t\t\tself.graph.element.appendChild(box.rangeElement);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( box.end ) {\n\n\t\t\t\t\tvar annotationRangeStart = left;\n\t\t\t\t\tvar annotationRangeEnd = Math.min( self.graph.x(box.end), self.graph.x.range()[1] );\n\n\t\t\t\t\t// annotation makes more sense at end\n\t\t\t\t\tif ( annotationRangeStart > annotationRangeEnd ) {\n\t\t\t\t\t\tannotationRangeEnd = left;\n\t\t\t\t\t\tannotationRangeStart = Math.max( self.graph.x(box.end), self.graph.x.range()[0] );\n\t\t\t\t\t}\n\n\t\t\t\t\tvar annotationRangeWidth = annotationRangeEnd - annotationRangeStart;\n\n\t\t\t\t\tbox.rangeElement.style.left = annotationRangeStart + 'px';\n\t\t\t\t\tbox.rangeElement.style.width = annotationRangeWidth + 'px';\n\n\t\t\t\t\tbox.rangeElement.classList.remove('offscreen');\n\t\t\t\t}\n\n\t\t\t\tannotation.line.classList.remove('offscreen');\n\t\t\t\tannotation.line.style.left = left + 'px';\n\t\t\t} );\n\t\t}, this );\n\t};\n\n\tthis.graph.onUpdate( function() { self.update() } );\n};\nRickshaw.namespace('Rickshaw.Graph.Axis.Time');\n\nRickshaw.Graph.Axis.Time = function(args) {\n\n\tvar self = this;\n\n\tthis.graph = args.graph;\n\tthis.elements = [];\n\tthis.ticksTreatment = args.ticksTreatment || 'plain';\n\tthis.fixedTimeUnit = args.timeUnit;\n\n\tvar time = args.timeFixture || new Rickshaw.Fixtures.Time();\n\n\tthis.appropriateTimeUnit = function() {\n\n\t\tvar unit;\n\t\tvar units = time.units;\n\n\t\tvar domain = this.graph.x.domain();\n\t\tvar rangeSeconds = domain[1] - domain[0];\n\n\t\tunits.forEach( function(u) {\n\t\t\tif (Math.floor(rangeSeconds / u.seconds) >= 2) {\n\t\t\t\tunit = unit || u;\n\t\t\t}\n\t\t} );\n\n\t\treturn (unit || time.units[time.units.length - 1]);\n\t};\n\n\tthis.tickOffsets = function() {\n\n\t\tvar domain = this.graph.x.domain();\n\n\t\tvar unit = this.fixedTimeUnit || this.appropriateTimeUnit();\n\t\tvar count = Math.ceil((domain[1] - domain[0]) / unit.seconds);\n\n\t\tvar runningTick = domain[0];\n\n\t\tvar offsets = [];\n\n\t\tfor (var i = 0; i < count; i++) {\n\n\t\t\tvar tickValue = time.ceil(runningTick, unit);\n\t\t\trunningTick = tickValue + unit.seconds / 2;\n\n\t\t\toffsets.push( { value: tickValue, unit: unit } );\n\t\t}\n\n\t\treturn offsets;\n\t};\n\n\tthis.render = function() {\n\n\t\tthis.elements.forEach( function(e) {\n\t\t\te.parentNode.removeChild(e);\n\t\t} );\n\n\t\tthis.elements = [];\n\n\t\tvar offsets = this.tickOffsets();\n\n\t\toffsets.forEach( function(o) {\n\t\t\t\n\t\t\tif (self.graph.x(o.value) > self.graph.x.range()[1]) return;\n\t\n\t\t\tvar element = document.createElement('div');\n\t\t\telement.style.left = self.graph.x(o.value) + 'px';\n\t\t\telement.classList.add('x_tick');\n\t\t\telement.classList.add(self.ticksTreatment);\n\n\t\t\tvar title = document.createElement('div');\n\t\t\ttitle.classList.add('title');\n\t\t\ttitle.innerHTML = o.unit.formatter(new Date(o.value * 1000));\n\t\t\telement.appendChild(title);\n\n\t\t\tself.graph.element.appendChild(element);\n\t\t\tself.elements.push(element);\n\n\t\t} );\n\t};\n\n\tthis.graph.onUpdate( function() { self.render() } );\n};\n\nRickshaw.namespace('Rickshaw.Graph.Axis.X');\n\nRickshaw.Graph.Axis.X = function(args) {\n\n\tvar self = this;\n\tvar berthRate = 0.10;\n\n\tthis.initialize = function(args) {\n\n\t\tthis.graph = args.graph;\n\t\tthis.orientation = args.orientation || 'top';\n\n\t\tthis.pixelsPerTick = args.pixelsPerTick || 75;\n\t\tif (args.ticks) this.staticTicks = args.ticks;\n\t\tif (args.tickValues) this.tickValues = args.tickValues;\n\n\t\tthis.tickSize = args.tickSize || 4;\n\t\tthis.ticksTreatment = args.ticksTreatment || 'plain';\n\n\t\tif (args.element) {\n\n\t\t\tthis.element = args.element;\n\t\t\tthis._discoverSize(args.element, args);\n\n\t\t\tthis.vis = d3.select(args.element)\n\t\t\t\t.append(\"svg:svg\")\n\t\t\t\t.attr('height', this.height)\n\t\t\t\t.attr('width', this.width)\n\t\t\t\t.attr('class', 'rickshaw_graph x_axis_d3');\n\n\t\t\tthis.element = this.vis[0][0];\n\t\t\tthis.element.style.position = 'relative';\n\n\t\t\tthis.setSize({ width: args.width, height: args.height });\n\n\t\t} else {\n\t\t\tthis.vis = this.graph.vis;\n\t\t}\n\n\t\tthis.graph.onUpdate( function() { self.render() } );\n\t};\n\n\tthis.setSize = function(args) {\n\n\t\targs = args || {};\n\t\tif (!this.element) return;\n\n\t\tthis._discoverSize(this.element.parentNode, args);\n\n\t\tthis.vis\n\t\t\t.attr('height', this.height)\n\t\t\t.attr('width', this.width * (1 + berthRate));\n\n\t\tvar berth = Math.floor(this.width * berthRate / 2);\n\t\tthis.element.style.left = -1 * berth + 'px';\n\t};\n\n\tthis.render = function() {\n\n\t\tif (this._renderWidth !== undefined && this.graph.width !== this._renderWidth) this.setSize({ auto: true });\n\n\t\tvar axis = d3.svg.axis().scale(this.graph.x).orient(this.orientation);\n\t\taxis.tickFormat( args.tickFormat || function(x) { return x } );\n\t\tif (this.tickValues) axis.tickValues(this.tickValues);\n\n\t\tthis.ticks = this.staticTicks || Math.floor(this.graph.width / this.pixelsPerTick);\n\n\t\tvar berth = Math.floor(this.width * berthRate / 2) || 0;\n\t\tvar bar_offset = this.graph.renderer.name == \"bar\" && Math.ceil(this.graph.width * 0.95 / this.graph.series[0].data.length / 2) || 0;\n\n\t\tvar transform;\n\n\t\tif (this.orientation == 'top') {\n\t\t\tvar yOffset = this.height || this.graph.height;\n\t\t\ttransform = 'translate(' + (berth + bar_offset) + ',' + yOffset + ')';\n\t\t} else {\n\t\t\ttransform = 'translate(' + (berth + bar_offset) + ', 0)';\n\t\t}\n\n\t\tif (this.element) {\n\t\t\tthis.vis.selectAll('*').remove();\n\t\t}\n\n\t\tthis.vis\n\t\t\t.append(\"svg:g\")\n\t\t\t.attr(\"class\", [\"x_ticks_d3\", this.ticksTreatment].join(\" \"))\n\t\t\t.attr(\"transform\", transform)\n\t\t\t.call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));\n\n\t\tvar gridSize = (this.orientation == 'bottom' ? 1 : -1) * this.graph.height;\n\n\t\tthis.graph.vis\n\t\t\t.append(\"svg:g\")\n\t\t\t.attr(\"class\", \"x_grid_d3\")\n\t\t\t.call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize))\n\t\t\t.selectAll('text')\n\t\t\t.each(function() { this.parentNode.setAttribute('data-x-value', this.textContent) });\n\n\t\tthis._renderHeight = this.graph.height;\n\t};\n\n\tthis._discoverSize = function(element, args) {\n\n\t\tif (typeof window !== 'undefined') {\n\n\t\t\tvar style = window.getComputedStyle(element, null);\n\t\t\tvar elementHeight = parseInt(style.getPropertyValue('height'), 10);\n\n\t\t\tif (!args.auto) {\n\t\t\t\tvar elementWidth = parseInt(style.getPropertyValue('width'), 10);\n\t\t\t}\n\t\t}\n\n\t\tthis.width = (args.width || elementWidth || this.graph.width) * (1 + berthRate);\n\t\tthis.height = args.height || elementHeight || 40;\n\t};\n\n\tthis.initialize(args);\n};\n\nRickshaw.namespace('Rickshaw.Graph.Axis.Y');\n\nRickshaw.Graph.Axis.Y = Rickshaw.Class.create( {\n\n\tinitialize: function(args) {\n\n\t\tthis.graph = args.graph;\n\t\tthis.orientation = args.orientation || 'right';\n\n\t\tthis.pixelsPerTick = args.pixelsPerTick || 75;\n\t\tif (args.ticks) this.staticTicks = args.ticks;\n\t\tif (args.tickValues) this.tickValues = args.tickValues;\n\n\t\tthis.tickSize = args.tickSize || 4;\n\t\tthis.ticksTreatment = args.ticksTreatment || 'plain';\n\n\t\tthis.tickFormat = args.tickFormat || function(y) { return y };\n\n\t\tthis.berthRate = 0.10;\n\n\t\tif (args.element) {\n\n\t\t\tthis.element = args.element;\n\t\t\tthis.vis = d3.select(args.element)\n\t\t\t\t.append(\"svg:svg\")\n\t\t\t\t.attr('class', 'rickshaw_graph y_axis');\n\n\t\t\tthis.element = this.vis[0][0];\n\t\t\tthis.element.style.position = 'relative';\n\n\t\t\tthis.setSize({ width: args.width, height: args.height });\n\n\t\t} else {\n\t\t\tthis.vis = this.graph.vis;\n\t\t}\n\n\t\tvar self = this;\n\t\tthis.graph.onUpdate( function() { self.render() } );\n\t},\n\n\tsetSize: function(args) {\n\n\t\targs = args || {};\n\n\t\tif (!this.element) return;\n\n\t\tif (typeof window !== 'undefined') {\n\n\t\t\tvar style = window.getComputedStyle(this.element.parentNode, null);\n\t\t\tvar elementWidth = parseInt(style.getPropertyValue('width'), 10);\n\n\t\t\tif (!args.auto) {\n\t\t\t\tvar elementHeight = parseInt(style.getPropertyValue('height'), 10);\n\t\t\t}\n\t\t}\n\n\t\tthis.width = args.width || elementWidth || this.graph.width * this.berthRate;\n\t\tthis.height = args.height || elementHeight || this.graph.height;\n\n\t\tthis.vis\n\t\t\t.attr('width', this.width)\n\t\t\t.attr('height', this.height * (1 + this.berthRate));\n\n\t\tvar berth = this.height * this.berthRate;\n\n\t\tif (this.orientation == 'left') {\n\t\t\tthis.element.style.top = -1 * berth + 'px';\n\t\t}\n\t},\n\n\trender: function() {\n\n\t\tif (this._renderHeight !== undefined && this.graph.height !== this._renderHeight) this.setSize({ auto: true });\n\n\t\tthis.ticks = this.staticTicks || Math.floor(this.graph.height / this.pixelsPerTick);\n\n\t\tvar axis = this._drawAxis(this.graph.y);\n\n\t\tthis._drawGrid(axis);\n\n\t\tthis._renderHeight = this.graph.height;\n\t},\n\n\t_drawAxis: function(scale) {\n\t\tvar axis = d3.svg.axis().scale(scale).orient(this.orientation);\n\t\taxis.tickFormat(this.tickFormat);\n\t\tif (this.tickValues) axis.tickValues(this.tickValues);\n\n\t\tif (this.orientation == 'left') {\n\t\t\tvar berth = this.height * this.berthRate;\n\t\t\tvar transform = 'translate(' + this.width + ', ' + berth + ')';\n\t\t}\n\n\t\tif (this.element) {\n\t\t\tthis.vis.selectAll('*').remove();\n\t\t}\n\n\t\tthis.vis\n\t\t\t.append(\"svg:g\")\n\t\t\t.attr(\"class\", [\"y_ticks\", this.ticksTreatment].join(\" \"))\n\t\t\t.attr(\"transform\", transform)\n\t\t\t.call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(this.tickSize));\n\n\t\treturn axis;\n\t},\n\n\t_drawGrid: function(axis) {\n\t\tvar gridSize = (this.orientation == 'right' ? 1 : -1) * this.graph.width;\n\n\t\tthis.graph.vis\n\t\t\t.append(\"svg:g\")\n\t\t\t.attr(\"class\", \"y_grid\")\n\t\t\t.call(axis.ticks(this.ticks).tickSubdivide(0).tickSize(gridSize))\n\t\t\t.selectAll('text')\n\t\t\t.each(function() { this.parentNode.setAttribute('data-y-value', this.textContent) });\n\t}\n} );\nRickshaw.namespace('Rickshaw.Graph.Axis.Y.Scaled');\n\nRickshaw.Graph.Axis.Y.Scaled = Rickshaw.Class.create( Rickshaw.Graph.Axis.Y, {\n\n initialize: function($super, args) {\n\n if (typeof(args.scale) === 'undefined') {\n throw new Error('Scaled requires scale');\n }\n\n this.scale = args.scale;\n\n if (typeof(args.grid) === 'undefined') {\n this.grid = true;\n } else {\n this.grid = args.grid;\n }\n\n $super(args);\n\n },\n\n _drawAxis: function($super, scale) {\n // Adjust scale's domain to compensate for adjustments to the\n // renderer's domain (e.g. padding).\n var domain = this.scale.domain();\n var renderDomain = this.graph.renderer.domain().y;\n\n var extents = [\n Math.min.apply(Math, domain),\n Math.max.apply(Math, domain)];\n\n // A mapping from the ideal render domain [0, 1] to the extent\n // of the original scale's domain. This is used to calculate\n // the extents of the adjusted domain.\n var extentMap = d3.scale.linear().domain([0, 1]).range(extents);\n\n var adjExtents = [\n extentMap(renderDomain[0]),\n extentMap(renderDomain[1])];\n\n // A mapping from the original domain to the adjusted domain.\n var adjustment = d3.scale.linear().domain(extents).range(adjExtents);\n\n // Make a copy of the custom scale, apply the adjusted domain, and\n // copy the range to match the graph's scale.\n var adjustedScale = this.scale.copy()\n .domain(domain.map(adjustment))\n .range(scale.range());\n\n return $super(adjustedScale);\n },\n\n _drawGrid: function($super, axis) {\n if (this.grid) {\n // only draw the axis if the grid option is true\n $super(axis);\n }\n }\n} );\nRickshaw.namespace('Rickshaw.Graph.Behavior.Series.Highlight');\n\nRickshaw.Graph.Behavior.Series.Highlight = function(args) {\n\n\tthis.graph = args.graph;\n\tthis.legend = args.legend;\n\n\tvar self = this;\n\n\tvar colorSafe = {};\n\tvar activeLine = null;\n\n\tvar disabledColor = args.disabledColor || function(seriesColor) {\n\t\treturn d3.interpolateRgb(seriesColor, d3.rgb('#d8d8d8'))(0.8).toString();\n\t};\n\n\tthis.addHighlightEvents = function (l) {\n\n\t\tl.element.addEventListener( 'mouseover', function(e) {\n\n\t\t\tif (activeLine) return;\n\t\t\telse activeLine = l;\n\n\t\t\tself.legend.lines.forEach( function(line) {\n\n\t\t\t\tif (l === line) {\n\n\t\t\t\t\t// if we're not in a stacked renderer bring active line to the top\n\t\t\t\t\tif (self.graph.renderer.unstack && (line.series.renderer ? line.series.renderer.unstack : true)) {\n\n\t\t\t\t\t\tvar seriesIndex = self.graph.series.indexOf(line.series);\n\t\t\t\t\t\tline.originalIndex = seriesIndex;\n\n\t\t\t\t\t\tvar series = self.graph.series.splice(seriesIndex, 1)[0];\n\t\t\t\t\t\tself.graph.series.push(series);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcolorSafe[line.series.name] = colorSafe[line.series.name] || line.series.color;\n\t\t\t\tline.series.color = disabledColor(line.series.color);\n\n\t\t\t} );\n\n\t\t\tself.graph.update();\n\n\t\t}, false );\n\n\t\tl.element.addEventListener( 'mouseout', function(e) {\n\n\t\t\tif (!activeLine) return;\n\t\t\telse activeLine = null;\n\n\t\t\tself.legend.lines.forEach( function(line) {\n\n\t\t\t\t// return reordered series to its original place\n\t\t\t\tif (l === line && line.hasOwnProperty('originalIndex')) {\n\n\t\t\t\t\tvar series = self.graph.series.pop();\n\t\t\t\t\tself.graph.series.splice(line.originalIndex, 0, series);\n\t\t\t\t\tdelete line.originalIndex;\n\t\t\t\t}\n\n\t\t\t\tif (colorSafe[line.series.name]) {\n\t\t\t\t\tline.series.color = colorSafe[line.series.name];\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tself.graph.update();\n\n\t\t}, false );\n\t};\n\n\tif (this.legend) {\n\t\tthis.legend.lines.forEach( function(l) {\n\t\t\tself.addHighlightEvents(l);\n\t\t} );\n\t}\n\n};\nRickshaw.namespace('Rickshaw.Graph.Behavior.Series.Order');\n\nRickshaw.Graph.Behavior.Series.Order = function(args) {\n\n\tthis.graph = args.graph;\n\tthis.legend = args.legend;\n\n\tvar self = this;\n\n\tif (typeof window.jQuery == 'undefined') {\n\t\tthrow \"couldn't find jQuery at window.jQuery\";\n\t}\n\n\tif (typeof window.jQuery.ui == 'undefined') {\n\t\tthrow \"couldn't find jQuery UI at window.jQuery.ui\";\n\t}\n\n\tjQuery(function() {\n\t\tjQuery(self.legend.list).sortable( {\n\t\t\tcontainment: 'parent',\n\t\t\ttolerance: 'pointer',\n\t\t\tupdate: function( event, ui ) {\n\t\t\t\tvar series = [];\n\t\t\t\tjQuery(self.legend.list).find('li').each( function(index, item) {\n\t\t\t\t\tif (!item.series) return;\n\t\t\t\t\tseries.push(item.series);\n\t\t\t\t} );\n\n\t\t\t\tfor (var i = self.graph.series.length - 1; i >= 0; i--) {\n\t\t\t\t\tself.graph.series[i] = series.shift();\n\t\t\t\t}\n\n\t\t\t\tself.graph.update();\n\t\t\t}\n\t\t} );\n\t\tjQuery(self.legend.list).disableSelection();\n\t});\n\n\t//hack to make jquery-ui sortable behave\n\tthis.graph.onUpdate( function() { \n\t\tvar h = window.getComputedStyle(self.legend.element).height;\n\t\tself.legend.element.style.height = h;\n\t} );\n};\nRickshaw.namespace('Rickshaw.Graph.Behavior.Series.Toggle');\n\nRickshaw.Graph.Behavior.Series.Toggle = function(args) {\n\n\tthis.graph = args.graph;\n\tthis.legend = args.legend;\n\n\tvar self = this;\n\n\tthis.addAnchor = function(line) {\n\n\t\tvar anchor = document.createElement('a');\n\t\tanchor.innerHTML = '✔';\n\t\tanchor.classList.add('action');\n\t\tline.element.insertBefore(anchor, line.element.firstChild);\n\n\t\tanchor.onclick = function(e) {\n\t\t\tif (line.series.disabled) {\n\t\t\t\tline.series.enable();\n\t\t\t\tline.element.classList.remove('disabled');\n\t\t\t} else { \n\t\t\t\tif (this.graph.series.filter(function(s) { return !s.disabled }).length <= 1) return;\n\t\t\t\tline.series.disable();\n\t\t\t\tline.element.classList.add('disabled');\n\t\t\t}\n\n\t\t\tself.graph.update();\n\n\t\t}.bind(this);\n\t\t\n var label = line.element.getElementsByTagName('span')[0];\n label.onclick = function(e){\n\n var disableAllOtherLines = line.series.disabled;\n if ( ! disableAllOtherLines ) {\n for ( var i = 0; i < self.legend.lines.length; i++ ) {\n var l = self.legend.lines[i];\n if ( line.series === l.series ) {\n // noop\n } else if ( l.series.disabled ) {\n // noop\n } else {\n disableAllOtherLines = true;\n break;\n }\n }\n }\n\n // show all or none\n if ( disableAllOtherLines ) {\n\n // these must happen first or else we try ( and probably fail ) to make a no line graph\n line.series.enable();\n line.element.classList.remove('disabled');\n\n self.legend.lines.forEach(function(l){\n if ( line.series === l.series ) {\n // noop\n } else {\n l.series.disable();\n l.element.classList.add('disabled');\n }\n });\n\n } else {\n\n self.legend.lines.forEach(function(l){\n l.series.enable();\n l.element.classList.remove('disabled');\n });\n\n }\n\n self.graph.update();\n\n };\n\n\t};\n\n\tif (this.legend) {\n\n\t\tif (typeof jQuery != 'undefined' && jQuery(this.legend.list).sortable) {\n\t\t\tjQuery(this.legend.list).sortable( {\n\t\t\t\tstart: function(event, ui) {\n\t\t\t\t\tui.item.bind('no.onclick',\n\t\t\t\t\t\tfunction(event) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tstop: function(event, ui) {\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tui.item.unbind('no.onclick');\n\t\t\t\t\t}, 250);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.legend.lines.forEach( function(l) {\n\t\t\tself.addAnchor(l);\n\t\t} );\n\t}\n\n\tthis._addBehavior = function() {\n\n\t\tthis.graph.series.forEach( function(s) {\n\t\t\t\n\t\t\ts.disable = function() {\n\n\t\t\t\tif (self.graph.series.length <= 1) {\n\t\t\t\t\tthrow('only one series left');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ts.disabled = true;\n\t\t\t};\n\n\t\t\ts.enable = function() {\n\t\t\t\ts.disabled = false;\n\t\t\t};\n\t\t} );\n\t};\n\tthis._addBehavior();\n\n\tthis.updateBehaviour = function () { this._addBehavior() };\n\n};\nRickshaw.namespace('Rickshaw.Graph.DragZoom');\n\nRickshaw.Graph.DragZoom = Rickshaw.Class.create({\n\n\tinitialize: function(args) {\n\t\tif (!args || !args.graph) {\n\t\t\tthrow new Error(\"Rickshaw.Graph.DragZoom needs a reference to a graph\");\n\t\t}\n\t\tvar defaults = {\n\t\t\topacity: 0.5,\n\t\t\tfill: 'steelblue',\n\t\t\tminimumTimeSelection: 60,\n\t\t\tcallback: function() {}\n\t\t};\n\n\t\tthis.graph = args.graph;\n\t\tthis.svg = d3.select(this.graph.element).select(\"svg\");\n\t\tthis.svgWidth = parseInt(this.svg.attr(\"width\"), 10);\n\t\tthis.opacity = args.opacity || defaults.opacity;\n\t\tthis.fill = args.fill || defaults.fill;\n\t\tthis.minimumTimeSelection = args.minimumTimeSelection || defaults.minimumTimeSelection;\n\t\tthis.callback = args.callback || defaults.callback;\n\n\t\tthis.registerMouseEvents();\n\t},\n\n\tregisterMouseEvents: function() {\n\t\tvar self = this;\n\t\tvar ESCAPE_KEYCODE = 27;\n\t\tvar rectangle;\n\n\t\tvar drag = {\n\t\t\tstartDt: null,\n\t\t\tstopDt: null,\n\t\t\tstartPX: null,\n\t\t\tstopPX: null\n\t\t};\n\n\t\tthis.svg.on(\"mousedown\", onMousedown);\n\n\t\tfunction onMouseup(datum, index) {\n\t\t\tdrag.stopDt = pointAsDate(d3.event);\n\t\t\tvar windowAfterDrag = [\n\t\t\t\tdrag.startDt,\n\t\t\t\tdrag.stopDt\n\t\t\t].sort(compareNumbers);\n\n\t\t\tself.graph.window.xMin = windowAfterDrag[0];\n\t\t\tself.graph.window.xMax = windowAfterDrag[1];\n\n\t\t\tvar endTime = self.graph.window.xMax;\n\t\t\tvar range = self.graph.window.xMax - self.graph.window.xMin;\n\n\t\t\treset(this);\n\n\t\t\tif (range < self.minimumTimeSelection || isNaN(range)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.graph.update();\n\t\t\tself.callback({range: range, endTime: endTime});\n\t\t}\n\n\t\tfunction onMousemove() {\n\t\t\tvar offset = drag.stopPX = (d3.event.offsetX || d3.event.layerX);\n\t\t\tif (offset > (self.svgWidth - 1) || offset < 1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar limits = [drag.startPX, offset].sort(compareNumbers);\n\t\t\tvar selectionWidth = limits[1]-limits[0];\n\t\t\tif (isNaN(selectionWidth)) {\n\t\t\t\treturn reset(this);\n\t\t\t}\n\t\t\trectangle.attr(\"fill\", self.fill)\n\t\t\t.attr(\"x\", limits[0])\n\t\t\t.attr(\"width\", selectionWidth);\n\t\t}\n\n\t\tfunction onMousedown() {\n\t\t\tvar el = d3.select(this);\n\t\t\trectangle = el.append(\"rect\")\n\t\t\t.style(\"opacity\", self.opacity)\n\t\t\t.attr(\"y\", 0)\n\t\t\t.attr(\"height\", \"100%\");\n\n\t\t\tif(d3.event.preventDefault) {\n\t\t\t\td3.event.preventDefault();\n\t\t\t} else {\n\t\t\t\td3.event.returnValue = false;\n\t\t\t}\n\t\t\tdrag.target = d3.event.target;\n\t\t\tdrag.startDt = pointAsDate(d3.event);\n\t\t\tdrag.startPX = d3.event.offsetX || d3.event.layerX;\n\t\t\tel.on(\"mousemove\", onMousemove);\n\t\t\td3.select(document).on(\"mouseup\", onMouseup);\n\t\t\td3.select(document).on(\"keyup\", function() {\n\t\t\t\tif (d3.event.keyCode === ESCAPE_KEYCODE) {\n\t\t\t\t\treset(this);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction reset(el) {\n\t\t\tvar s = d3.select(el);\n\t\t\ts.on(\"mousemove\", null);\n\t\t\td3.select(document).on(\"mouseup\", null);\n\t\t\tdrag = {};\n\t\t\trectangle.remove();\n\t\t}\n\n\t\tfunction compareNumbers(a, b) {\n\t\t\treturn a - b;\n\t\t}\n\n\t\tfunction pointAsDate(e) {\n\t\t\treturn Math.floor(self.graph.x.invert(e.offsetX || e.layerX));\n\t\t}\n\t}\n});\nRickshaw.namespace('Rickshaw.Graph.HoverDetail');\n\nRickshaw.Graph.HoverDetail = Rickshaw.Class.create({\n\n\tinitialize: function(args) {\n\n\t\tvar graph = this.graph = args.graph;\n\n\t\tthis.xFormatter = args.xFormatter || function(x) {\n\t\t\treturn new Date( x * 1000 ).toUTCString();\n\t\t};\n\n\t\tthis.yFormatter = args.yFormatter || function(y) {\n\t\t\treturn y === null ? y : y.toFixed(2);\n\t\t};\n\n\t\tvar element = this.element = document.createElement('div');\n\t\telement.className = 'detail inactive';\n\n\t\tthis.visible = true;\n\t\tgraph.element.appendChild(element);\n\n\t\tthis.lastEvent = null;\n\t\tthis._addListeners();\n\n\t\tthis.onShow = args.onShow;\n\t\tthis.onHide = args.onHide;\n\t\tthis.onRender = args.onRender;\n\n\t\tthis.formatter = args.formatter || this.formatter;\n\n\t},\n\n\tformatter: function(series, x, y, formattedX, formattedY, d) {\n\t\treturn series.name + ': ' + formattedY;\n\t},\n\n\tupdate: function(e) {\n\n\t\te = e || this.lastEvent;\n\t\tif (!e) return;\n\t\tthis.lastEvent = e;\n\n\t\tif (!e.target.nodeName.match(/^(path|svg|rect|circle)$/)) return;\n\n\t\tvar graph = this.graph;\n\n\t\tvar eventX = e.layerX || e.offsetX;\n\t\tvar eventY = e.layerY || e.offsetY;\n\n\t\tvar j = 0;\n\t\tvar points = [];\n\t\tvar nearestPoint;\n\n\t\tthis.graph.series.active().forEach( function(series) {\n\n\t\t\tvar data = this.graph.stackedData[j++];\n\n\t\t\tif (!data.length)\n\t\t\t\treturn;\n\n\t\t\tvar domainX = graph.x.invert(eventX);\n\n\t\t\tvar domainIndexScale = d3.scale.linear()\n\t\t\t\t.domain([data[0].x, data.slice(-1)[0].x])\n\t\t\t\t.range([0, data.length - 1]);\n\n\t\t\tvar approximateIndex = Math.round(domainIndexScale(domainX));\n\t\t\tif (approximateIndex == data.length - 1) approximateIndex--;\n\n\t\t\tvar dataIndex = Math.min(approximateIndex || 0, data.length - 1);\n\n\t\t\tfor (var i = approximateIndex; i < data.length - 1;) {\n\n\t\t\t\tif (!data[i] || !data[i + 1]) break;\n\n\t\t\t\tif (data[i].x <= domainX && data[i + 1].x > domainX) {\n\t\t\t\t\tdataIndex = Math.abs(domainX - data[i].x) < Math.abs(domainX - data[i + 1].x) ? i : i + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (data[i + 1].x <= domainX) { i++ } else { i-- }\n\t\t\t}\n\n\t\t\tif (dataIndex < 0) dataIndex = 0;\n\t\t\tvar value = data[dataIndex];\n\n\t\t\tvar distance = Math.sqrt(\n\t\t\t\tMath.pow(Math.abs(graph.x(value.x) - eventX), 2) +\n\t\t\t\tMath.pow(Math.abs(graph.y(value.y + value.y0) - eventY), 2)\n\t\t\t);\n\n\t\t\tvar xFormatter = series.xFormatter || this.xFormatter;\n\t\t\tvar yFormatter = series.yFormatter || this.yFormatter;\n\n\t\t\tvar point = {\n\t\t\t\tformattedXValue: xFormatter(value.x),\n\t\t\t\tformattedYValue: yFormatter(series.scale ? series.scale.invert(value.y) : value.y),\n\t\t\t\tseries: series,\n\t\t\t\tvalue: value,\n\t\t\t\tdistance: distance,\n\t\t\t\torder: j,\n\t\t\t\tname: series.name\n\t\t\t};\n\n\t\t\tif (!nearestPoint || distance < nearestPoint.distance) {\n\t\t\t\tnearestPoint = point;\n\t\t\t}\n\n\t\t\tpoints.push(point);\n\n\t\t}, this );\n\n\t\tif (!nearestPoint)\n\t\t\treturn;\n\n\t\tnearestPoint.active = true;\n\n\t\tvar domainX = nearestPoint.value.x;\n\t\tvar formattedXValue = nearestPoint.formattedXValue;\n\n\t\tthis.element.innerHTML = '';\n\t\tthis.element.style.left = graph.x(domainX) + 'px';\n\n\t\tthis.visible && this.render( {\n\t\t\tpoints: points,\n\t\t\tdetail: points, // for backwards compatibility\n\t\t\tmouseX: eventX,\n\t\t\tmouseY: eventY,\n\t\t\tformattedXValue: formattedXValue,\n\t\t\tdomainX: domainX\n\t\t} );\n\t},\n\n\thide: function() {\n\t\tthis.visible = false;\n\t\tthis.element.classList.add('inactive');\n\n\t\tif (typeof this.onHide == 'function') {\n\t\t\tthis.onHide();\n\t\t}\n\t},\n\n\tshow: function() {\n\t\tthis.visible = true;\n\t\tthis.element.classList.remove('inactive');\n\n\t\tif (typeof this.onShow == 'function') {\n\t\t\tthis.onShow();\n\t\t}\n\t},\n\n\trender: function(args) {\n\n\t\tvar graph = this.graph;\n\t\tvar points = args.points;\n\t\tvar point = points.filter( function(p) { return p.active } ).shift();\n\n\t\tif (point.value.y === null) return;\n\n\t\tvar formattedXValue = point.formattedXValue;\n\t\tvar formattedYValue = point.formattedYValue;\n\n\t\tthis.element.innerHTML = '';\n\t\tthis.element.style.left = graph.x(point.value.x) + 'px';\n\n\t\tvar xLabel = document.createElement('div');\n\n\t\txLabel.className = 'x_label';\n\t\txLabel.innerHTML = formattedXValue;\n\t\tthis.element.appendChild(xLabel);\n\n\t\tvar item = document.createElement('div');\n\n\t\titem.className = 'item';\n\n\t\t// invert the scale if this series displays using a scale\n\t\tvar series = point.series;\n\t\tvar actualY = series.scale ? series.scale.invert(point.value.y) : point.value.y;\n\n\t\titem.innerHTML = this.formatter(series, point.value.x, actualY, formattedXValue, formattedYValue, point);\n\t\titem.style.top = this.graph.y(point.value.y0 + point.value.y) + 'px';\n\n\t\tthis.element.appendChild(item);\n\n\t\tvar dot = document.createElement('div');\n\n\t\tdot.className = 'dot';\n\t\tdot.style.top = item.style.top;\n\t\tdot.style.borderColor = series.color;\n\n\t\tthis.element.appendChild(dot);\n\n\t\tif (point.active) {\n\t\t\titem.classList.add('active');\n\t\t\tdot.classList.add('active');\n\t\t}\n\n\t\t// Assume left alignment until the element has been displayed and\n\t\t// bounding box calculations are possible.\n\t\tvar alignables = [xLabel, item];\n\t\talignables.forEach(function(el) {\n\t\t\tel.classList.add('left');\n\t\t});\n\n\t\tthis.show();\n\n\t\t// If left-alignment results in any error, try right-alignment.\n\t\tvar leftAlignError = this._calcLayoutError(alignables);\n\t\tif (leftAlignError > 0) {\n\t\t\talignables.forEach(function(el) {\n\t\t\t\tel.classList.remove('left');\n\t\t\t\tel.classList.add('right');\n\t\t\t});\n\n\t\t\t// If right-alignment is worse than left alignment, switch back.\n\t\t\tvar rightAlignError = this._calcLayoutError(alignables);\n\t\t\tif (rightAlignError > leftAlignError) {\n\t\t\t\talignables.forEach(function(el) {\n\t\t\t\t\tel.classList.remove('right');\n\t\t\t\t\tel.classList.add('left');\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.onRender == 'function') {\n\t\t\tthis.onRender(args);\n\t\t}\n\t},\n\n\t_calcLayoutError: function(alignables) {\n\t\t// Layout error is calculated as the number of linear pixels by which\n\t\t// an alignable extends past the left or right edge of the parent.\n\t\tvar parentRect = this.element.parentNode.getBoundingClientRect();\n\n\t\tvar error = 0;\n\t\tvar alignRight = alignables.forEach(function(el) {\n\t\t\tvar rect = el.getBoundingClientRect();\n\t\t\tif (!rect.width) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (rect.right > parentRect.right) {\n\t\t\t\terror += rect.right - parentRect.right;\n\t\t\t}\n\n\t\t\tif (rect.left < parentRect.left) {\n\t\t\t\terror += parentRect.left - rect.left;\n\t\t\t}\n\t\t});\n\t\treturn error;\n\t},\n\n\t_addListeners: function() {\n\n\t\t// Keep reference for later removal.\n\t\tthis.mousemoveListener = function(e) {\n\t\t\tthis.visible = true;\n\t\t\tthis.update(e);\n\t\t}.bind(this);\n\n\t\t// Add listener.\n\t\tthis.graph.element.addEventListener(\n\t\t\t'mousemove',\n\t\t\tthis.mousemoveListener,\n\t\t\tfalse\n\t\t);\n\n\t\tthis.graph.onUpdate( function() { this.update() }.bind(this) );\n\n\t\t// Keep reference for later removal.\n\t\tthis.mouseoutListener = function(e) {\n\t\t\tif (e.relatedTarget && !(e.relatedTarget.compareDocumentPosition(this.graph.element) & Node.DOCUMENT_POSITION_CONTAINS)) {\n\t\t\t\tthis.hide();\n\t\t\t}\n\t\t}.bind(this);\n\n\t\t// Add listener.\n\t\tthis.graph.element.addEventListener(\n\t\t\t'mouseout',\n\t\t\tthis.mouseoutListener,\n\t\t\tfalse\n\t\t);\n\t},\n\n\t_removeListeners: function() {\n\t\tif (this.mousemoveListener) {\n\t\t\tthis.graph.element.removeEventListener('mousemove', this.mousemoveListener, false);\n\t\t}\n\t\tif (this.mouseoutListener) {\n\t\t\tthis.graph.element.removeEventListener('mouseout', this.mouseoutListener, false);\n\t\t}\n\t}\n});\nRickshaw.namespace('Rickshaw.Graph.JSONP');\n\nRickshaw.Graph.JSONP = Rickshaw.Class.create( Rickshaw.Graph.Ajax, {\n\n\trequest: function() {\n\n\t\tjQuery.ajax( {\n\t\t\turl: this.dataURL,\n\t\t\tdataType: 'jsonp',\n\t\t\tsuccess: this.success.bind(this),\n\t\t\terror: this.error.bind(this)\n\t\t} );\n\t}\n} );\nRickshaw.namespace('Rickshaw.Graph.Legend');\n\nRickshaw.Graph.Legend = Rickshaw.Class.create( {\n\n\tclassName: 'rickshaw_legend',\n\n\tinitialize: function(args) {\n\t\tthis.element = args.element;\n\t\tthis.graph = args.graph;\n\t\tthis.naturalOrder = args.naturalOrder;\n\n\t\tthis.element.classList.add(this.className);\n\n\t\tthis.list = document.createElement('ul');\n\t\tthis.element.appendChild(this.list);\n\n\t\tthis.render();\n\n\t\t// we could bind this.render.bind(this) here\n\t\t// but triggering the re-render would lose the added\n\t\t// behavior of the series toggle\n\t\tthis.graph.onUpdate( function() {} );\n\t},\n\n\trender: function() {\n\t\tvar self = this;\n\n\t\twhile ( this.list.firstChild ) {\n\t\t\tthis.list.removeChild( this.list.firstChild );\n\t\t}\n\t\tthis.lines = [];\n\n\t\tvar series = this.graph.series\n\t\t\t.map( function(s) { return s } );\n\n\t\tif (!this.naturalOrder) {\n\t\t\tseries = series.reverse();\n\t\t}\n\n\t\tseries.forEach( function(s) {\n\t\t\tself.addLine(s);\n\t\t} );\n\n\n\t},\n\n\taddLine: function (series) {\n\t\tvar line = document.createElement('li');\n\t\tline.className = 'line';\n\t\tif (series.disabled) {\n\t\t\tline.className += ' disabled';\n\t\t}\n\t\tif (series.className) {\n\t\t\td3.select(line).classed(series.className, true);\n\t\t}\n\t\tvar swatch = document.createElement('div');\n\t\tswatch.className = 'swatch';\n\t\tswatch.style.backgroundColor = series.color;\n\n\t\tline.appendChild(swatch);\n\n\t\tvar label = document.createElement('span');\n\t\tlabel.className = 'label';\n\t\tlabel.innerHTML = series.name;\n\n\t\tline.appendChild(label);\n\t\tthis.list.appendChild(line);\n\n\t\tline.series = series;\n\n\t\tif (series.noLegend) {\n\t\t\tline.style.display = 'none';\n\t\t}\n\n\t\tvar _line = { element: line, series: series };\n\t\tif (this.shelving) {\n\t\t\tthis.shelving.addAnchor(_line);\n\t\t\tthis.shelving.updateBehaviour();\n\t\t}\n\t\tif (this.highlighter) {\n\t\t\tthis.highlighter.addHighlightEvents(_line);\n\t\t}\n\t\tthis.lines.push(_line);\n\t\treturn line;\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.RangeSlider');\n\nRickshaw.Graph.RangeSlider = Rickshaw.Class.create({\n\n\tinitialize: function(args) {\n\n\t\tvar $ = jQuery;\n\t\tvar self = this;\n\t\tvar element = this.element = args.element;\n\t\tvar graphs = this.graphs = args.graphs;\n\t\tif (!graphs) {\n\t\t\tgraphs = this.graph = args.graph;\n\t\t}\n\t\tif (graphs.constructor !== Array) {\n\t\t\tgraphs = [graphs];\n\t\t}\n\t\tthis.graph = graphs[0];\n\n\t\tthis.slideCallbacks = [];\n\n\t\tthis.build();\n\n\t\tfor (var i = 0; i < graphs.length; i++) {\n\t\t\tgraphs[i].onUpdate(function() {\n\t\t\t\tself.update();\n\t\t\t}.bind(self));\n\n\t\t\t(function(idx){\n\t\t\t\tgraphs[idx].onConfigure(function() {\n\t\t\t\t\t$(this.element)[0].style.width = graphs[idx].width + 'px';\n\t\t\t\t}.bind(self));\n\t\t\t})(i);\n\t\t}\n\n\t},\n\n\tbuild: function() {\n\n\t\tvar domain;\n\t\tvar element = this.element;\n\t\tvar $ = jQuery;\n\t\tvar self = this;\n\t\tvar graphs = this.graphs || this.graph;\n\n\t\tif (graphs.constructor !== Array) {\n\t\t\tgraphs = [graphs];\n\t\t}\n\n\t\t// base the slider's min/max on the first graph\n\t\tthis.graph = graphs[0];\n\t\tdomain = graphs[0].dataDomain();\n\n\t\t$(function() {\n\t\t\t$(element).slider({\n\t\t\t\trange: true,\n\t\t\t\tmin: domain[0],\n\t\t\t\tmax: domain[1],\n\t\t\t\tvalues: [\n\t\t\t\t\tdomain[0],\n\t\t\t\t\tdomain[1]\n\t\t\t\t],\n\t\t\t\tstart: function(event, ui) {\n\t\t\t\t\tself.slideStarted({ event: event, ui: ui });\n\t\t\t\t},\n\t\t\t\tstop: function(event, ui) {\n\t\t\t\t\tself.slideFinished({ event: event, ui: ui });\n\t\t\t\t},\n\t\t\t\tslide: function(event, ui) {\n\t\t\t\t\tif (!self.slideShouldUpdate(event, ui))\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tif (ui.values[1] <= ui.values[0]) return;\n\n\t\t\t\t\tfor (var i = 0; i < graphs.length; i++) {\n\t\t\t\t\t\tself.processSlideChange({\n\t\t\t\t\t\t\tevent: event,\n\t\t\t\t\t\t\tui: ui,\n\t\t\t\t\t\t\tgraph: graphs[i]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\tgraphs[0].onConfigure(function() {\n\t\t\t$(this.element)[0].style.width = graphs[0].width + 'px';\n\t\t}.bind(this));\n\n\t},\n\n\tupdate: function() {\n\n\t\tvar element = this.element;\n\t\tvar graph = this.graph;\n\t\tvar $ = jQuery;\n\n\t\tvar values = $(element).slider('option', 'values');\n\n\t\tvar domain = graph.dataDomain();\n\n\t\t$(element).slider('option', 'min', domain[0]);\n\t\t$(element).slider('option', 'max', domain[1]);\n\n\t\tif (graph.window.xMin == null) {\n\t\t\tvalues[0] = domain[0];\n\t\t}\n\t\tif (graph.window.xMax == null) {\n\t\t\tvalues[1] = domain[1];\n\t\t}\n\n\t\t$(element).slider('option', 'values', values);\n\t},\n\n\tonSlide: function(callback) {\n\t\tthis.slideCallbacks.push(callback);\n\t},\n\n\tprocessSlideChange: function(args) {\n\t\tvar event = args.event;\n\t\tvar ui = args.ui;\n\t\tvar graph = args.graph;\n\n\t\tgraph.window.xMin = ui.values[0];\n\t\tgraph.window.xMax = ui.values[1];\n\t\tgraph.update();\n\n\t\tvar domain = graph.dataDomain();\n\n\t\t// if we're at an extreme, stick there\n\t\tif (domain[0] == ui.values[0]) {\n\t\t\tgraph.window.xMin = undefined;\n\t\t}\n\n\t\tif (domain[1] == ui.values[1]) {\n\t\t\tgraph.window.xMax = undefined;\n\t\t}\n\n\t\tthis.slideCallbacks.forEach(function(callback) {\n\t\t\tcallback(graph, graph.window.xMin, graph.window.xMax);\n\t\t});\n\n\t},\n\n\t// allows the slide updates to bail out if sliding is not permitted\n\tslideShouldUpdate: function() {\n\t\treturn true;\n\t},\n\n\tslideStarted: function() {\n\t\treturn;\n\t},\n\n\tslideFinished: function() {\n\t\treturn;\n\t}\n});\n\nRickshaw.namespace('Rickshaw.Graph.RangeSlider.Preview');\n\nRickshaw.Graph.RangeSlider.Preview = Rickshaw.Class.create({\n\n\tinitialize: function(args) {\n\n\t\tif (!args.element) throw \"Rickshaw.Graph.RangeSlider.Preview needs a reference to an element\";\n\t\tif (!args.graph && !args.graphs) throw \"Rickshaw.Graph.RangeSlider.Preview needs a reference to an graph or an array of graphs\";\n\n\t\tthis.element = args.element;\n\t\tthis.element.style.position = 'relative';\n\n\t\tthis.graphs = args.graph ? [ args.graph ] : args.graphs;\n\n\t\tthis.defaults = {\n\t\t\theight: 75,\n\t\t\twidth: 400,\n\t\t\tgripperColor: undefined,\n\t\t\tframeTopThickness: 3,\n\t\t\tframeHandleThickness: 10,\n\t\t\tframeColor: \"#d4d4d4\",\n\t\t\tframeOpacity: 1,\n\t\t\tminimumFrameWidth: 0,\n\t\t\theightRatio: 0.2\n\t\t};\n\n\t\tthis.heightRatio = args.heightRatio || this.defaults.heightRatio;\n\t\tthis.defaults.gripperColor = d3.rgb(this.defaults.frameColor).darker().toString(); \n\n\t\tthis.configureCallbacks = [];\n\t\tthis.slideCallbacks = [];\n\n\t\tthis.previews = [];\n\n\t\tif (!args.width) this.widthFromGraph = true;\n\t\tif (!args.height) this.heightFromGraph = true;\n\n\t\tif (this.widthFromGraph || this.heightFromGraph) {\n\t\t\tthis.graphs[0].onConfigure(function () {\n\t\t\t\tthis.configure(args); this.render();\n\t\t\t}.bind(this));\n\t\t}\n\n\t\targs.width = args.width || this.graphs[0].width || this.defaults.width;\n\t\targs.height = args.height || this.graphs[0].height * this.heightRatio || this.defaults.height;\n\n\t\tthis.configure(args);\n\t\tthis.render();\n\t},\n\n\tonSlide: function(callback) {\n\t\tthis.slideCallbacks.push(callback);\n\t},\n\n\tonConfigure: function(callback) {\n\t\tthis.configureCallbacks.push(callback);\n\t},\n\n\tconfigure: function(args) {\n\n\t\tthis.config = this.config || {};\n\n\t\tthis.configureCallbacks.forEach(function(callback) {\n\t\t\tcallback(args);\n\t\t});\n\n\t\tRickshaw.keys(this.defaults).forEach(function(k) {\n\t\t\tthis.config[k] = k in args ? args[k]\n\t\t\t\t: k in this.config ? this.config[k]\n\t\t\t\t: this.defaults[k];\n\t\t}, this);\n\n\t\tif ('width' in args || 'height' in args) {\n\n\t\t\tif (this.widthFromGraph) {\n\t\t\t\tthis.config.width = this.graphs[0].width;\n\t\t\t}\n\n\t\t\tif (this.heightFromGraph) {\n\t\t\t\tthis.config.height = this.graphs[0].height * this.heightRatio;\n\t\t\t\tthis.previewHeight = this.config.height;\n\t\t\t}\n\n\t\t\tthis.previews.forEach(function(preview) {\n\n\t\t\t\tvar height = this.previewHeight / this.graphs.length - this.config.frameTopThickness * 2;\n\t\t\t\tvar width = this.config.width - this.config.frameHandleThickness * 2;\n\t\t\t\tpreview.setSize({ width: width, height: height });\n\n\t\t\t\tif (this.svg) {\n\t\t\t\t\tvar svgHeight = height + this.config.frameHandleThickness * 2;\n\t\t\t\t\tvar svgWidth = width + this.config.frameHandleThickness * 2;\n\t\t\t\t\tthis.svg.style(\"width\", svgWidth + \"px\");\n\t\t\t\t\tthis.svg.style(\"height\", svgHeight + \"px\");\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t},\n\n\trender: function() {\n\n\t\tvar self = this;\n\n\t\tthis.svg = d3.select(this.element)\n\t\t\t.selectAll(\"svg.rickshaw_range_slider_preview\")\n\t\t\t.data([null]);\n\n\t\tthis.previewHeight = this.config.height - (this.config.frameTopThickness * 2);\n\t\tthis.previewWidth = this.config.width - (this.config.frameHandleThickness * 2);\n\n\t\tthis.currentFrame = [0, this.previewWidth];\n\n\t\tvar buildGraph = function(parent, index) {\n\n\t\t\tvar graphArgs = Rickshaw.extend({}, parent.config);\n\t\t\tvar height = self.previewHeight / self.graphs.length;\n\t\t\tvar renderer = parent.renderer.name;\n\n\t\t\tRickshaw.extend(graphArgs, {\n\t\t\t\telement: this.appendChild(document.createElement(\"div\")),\n\t\t\t\theight: height,\n\t\t\t\twidth: self.previewWidth,\n\t\t\t\tseries: parent.series,\n\t\t\t\trenderer: renderer\n\t\t\t});\n\n\t\t\tvar graph = new Rickshaw.Graph(graphArgs);\n\t\t\tself.previews.push(graph);\n\n\t\t\tparent.onUpdate(function() { graph.render(); self.render() });\n\n\t\t\tparent.onConfigure(function(args) { \n\t\t\t\t// don't propagate height\n\t\t\t\tdelete args.height;\n\t\t\t\targs.width = args.width - self.config.frameHandleThickness * 2;\n\t\t\t\tgraph.configure(args);\n\t\t\t\tgraph.render();\n\t\t\t});\n\n\t\t\tgraph.render();\n\t\t};\n\n\t\tvar graphContainer = d3.select(this.element)\n\t\t\t.selectAll(\"div.rickshaw_range_slider_preview_container\")\n\t\t\t.data(this.graphs);\n\n\t\tvar translateCommand = \"translate(\" +\n\t\t\tthis.config.frameHandleThickness + \"px, \" +\n\t\t\tthis.config.frameTopThickness + \"px)\";\n\n\t\tgraphContainer.enter()\n\t\t\t.append(\"div\")\n\t\t\t.classed(\"rickshaw_range_slider_preview_container\", true)\n\t\t\t.style(\"-webkit-transform\", translateCommand)\n\t\t\t.style(\"-moz-transform\", translateCommand)\n\t\t\t.style(\"-ms-transform\", translateCommand)\n\t\t\t.style(\"transform\", translateCommand)\n\t\t\t.each(buildGraph);\n\n\t\tgraphContainer.exit()\n\t\t\t.remove();\n\n\t\t// Use the first graph as the \"master\" for the frame state\n\t\tvar masterGraph = this.graphs[0];\n\n\t\tvar domainScale = d3.scale.linear()\n\t\t\t.domain([0, this.previewWidth])\n\t\t\t.range(masterGraph.dataDomain());\n\n\t\tvar currentWindow = [masterGraph.window.xMin, masterGraph.window.xMax];\n\n\t\tthis.currentFrame[0] = currentWindow[0] === undefined ? \n\t\t\t0 : Math.round(domainScale.invert(currentWindow[0]));\n\n\t\tif (this.currentFrame[0] < 0) this.currentFrame[0] = 0;\n\n\t\tthis.currentFrame[1] = currentWindow[1] === undefined ?\n\t\t\tthis.previewWidth : domainScale.invert(currentWindow[1]);\n\n\t\tif (this.currentFrame[1] - this.currentFrame[0] < self.config.minimumFrameWidth) {\n\t\t\tthis.currentFrame[1] = (this.currentFrame[0] || 0) + self.config.minimumFrameWidth;\n\t\t}\n\n\t\tthis.svg.enter()\n\t\t\t.append(\"svg\")\n\t\t\t.classed(\"rickshaw_range_slider_preview\", true)\n\t\t\t.style(\"height\", this.config.height + \"px\")\n\t\t\t.style(\"width\", this.config.width + \"px\")\n\t\t\t.style(\"position\", \"absolute\")\n\t\t\t.style(\"top\", 0);\n\n\t\tthis._renderDimming();\n\t\tthis._renderFrame();\n\t\tthis._renderGrippers();\n\t\tthis._renderHandles();\n\t\tthis._renderMiddle();\n\n\t\tthis._registerMouseEvents();\n\t},\n\n\t_renderDimming: function() {\n\n\t\tvar element = this.svg\n\t\t\t.selectAll(\"path.dimming\")\n\t\t\t.data([null]);\n\n\t\telement.enter()\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"fill\", \"white\")\n\t\t\t.attr(\"fill-opacity\", \"0.7\")\n\t\t\t.attr(\"fill-rule\", \"evenodd\")\n\t\t\t.classed(\"dimming\", true);\n\n\t\tvar path = \"\";\n\t\tpath += \" M \" + this.config.frameHandleThickness + \" \" + this.config.frameTopThickness;\n\t\tpath += \" h \" + this.previewWidth;\n\t\tpath += \" v \" + this.previewHeight;\n\t\tpath += \" h \" + -this.previewWidth;\n\t\tpath += \" z \";\n\t\tpath += \" M \" + Math.max(this.currentFrame[0], this.config.frameHandleThickness) + \" \" + this.config.frameTopThickness;\n\t\tpath += \" H \" + Math.min(this.currentFrame[1] + this.config.frameHandleThickness * 2, this.previewWidth + this.config.frameHandleThickness);\n\t\tpath += \" v \" + this.previewHeight;\n\t\tpath += \" H \" + Math.max(this.currentFrame[0], this.config.frameHandleThickness);\n\t\tpath += \" z\";\n\n\t\telement.attr(\"d\", path);\n\t},\n\n\t_renderFrame: function() {\n\n\t\tvar element = this.svg\n\t\t\t.selectAll(\"path.frame\")\n\t\t\t.data([null]);\n\n\t\telement.enter()\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"stroke\", \"white\")\n\t\t\t.attr(\"stroke-width\", \"1px\")\n\t\t\t.attr(\"stroke-linejoin\", \"round\")\n\t\t\t.attr(\"fill\", this.config.frameColor)\n\t\t\t.attr(\"fill-opacity\", this.config.frameOpacity)\n\t\t\t.attr(\"fill-rule\", \"evenodd\")\n\t\t\t.classed(\"frame\", true);\n\n\t\tvar path = \"\";\n\t\tpath += \" M \" + this.currentFrame[0] + \" 0\";\n\t\tpath += \" H \" + (this.currentFrame[1] + (this.config.frameHandleThickness * 2));\n\t\tpath += \" V \" + this.config.height;\n\t\tpath += \" H \" + (this.currentFrame[0]);\n\t\tpath += \" z\";\n\t\tpath += \" M \" + (this.currentFrame[0] + this.config.frameHandleThickness) + \" \" + this.config.frameTopThickness;\n\t\tpath += \" H \" + (this.currentFrame[1] + this.config.frameHandleThickness);\n\t\tpath += \" v \" + this.previewHeight;\n\t\tpath += \" H \" + (this.currentFrame[0] + this.config.frameHandleThickness);\n\t\tpath += \" z\";\n\n\t\telement.attr(\"d\", path);\n\t},\n\n\t_renderGrippers: function() {\n\n\t\tvar gripper = this.svg.selectAll(\"path.gripper\")\n\t\t\t.data([null]);\n\n\t\tgripper.enter()\n\t\t\t.append(\"path\")\n\t\t\t.attr(\"stroke\", this.config.gripperColor)\n\t\t\t.classed(\"gripper\", true);\n\n\t\tvar path = \"\";\n\n\t\t[0.4, 0.6].forEach(function(spacing) {\n\t\t\tpath += \" M \" + Math.round((this.currentFrame[0] + (this.config.frameHandleThickness * spacing))) + \" \" + Math.round(this.config.height * 0.3);\n\t\t\tpath += \" V \" + Math.round(this.config.height * 0.7);\n\t\t\tpath += \" M \" + Math.round((this.currentFrame[1] + (this.config.frameHandleThickness * (1 + spacing)))) + \" \" + Math.round(this.config.height * 0.3);\n\t\t\tpath += \" V \" + Math.round(this.config.height * 0.7);\n\t\t}.bind(this));\n\n\t\tgripper.attr(\"d\", path);\n\t},\n\n\t_renderHandles: function() {\n\n\t\tvar leftHandle = this.svg.selectAll(\"rect.left_handle\")\n\t\t\t.data([null]);\n\n\t\tleftHandle.enter()\n\t\t\t.append(\"rect\")\n\t\t\t.attr('width', this.config.frameHandleThickness)\n\t\t\t.style(\"cursor\", \"ew-resize\")\n\t\t\t.style(\"fill-opacity\", \"0\")\n\t\t\t.classed(\"left_handle\", true);\n\n\t\tleftHandle\n\t\t\t.attr('x', this.currentFrame[0])\n\t\t\t.attr('height', this.config.height);\n\n\t\tvar rightHandle = this.svg.selectAll(\"rect.right_handle\")\n\t\t\t.data([null]);\n\n\t\trightHandle.enter()\n\t\t\t.append(\"rect\")\n\t\t\t.attr('width', this.config.frameHandleThickness)\n\t\t\t.style(\"cursor\", \"ew-resize\")\n\t\t\t.style(\"fill-opacity\", \"0\")\n\t\t\t.classed(\"right_handle\", true);\n\n\t\trightHandle\n\t\t\t.attr('x', this.currentFrame[1] + this.config.frameHandleThickness)\n\t\t\t.attr('height', this.config.height);\n\t},\n\n\t_renderMiddle: function() {\n\n\t\tvar middleHandle = this.svg.selectAll(\"rect.middle_handle\")\n\t\t\t.data([null]);\n\n\t\tmiddleHandle.enter()\n\t\t\t.append(\"rect\")\n\t\t\t.style(\"cursor\", \"move\")\n\t\t\t.style(\"fill-opacity\", \"0\")\n\t\t\t.classed(\"middle_handle\", true);\n\n\t\tmiddleHandle\n\t\t\t.attr('width', Math.max(0, this.currentFrame[1] - this.currentFrame[0]))\n\t\t\t.attr('x', this.currentFrame[0] + this.config.frameHandleThickness)\n\t\t\t.attr('height', this.config.height);\n\t},\n\n\t_registerMouseEvents: function() {\n\n\t\tvar element = d3.select(this.element);\n\n\t\tvar drag = {\n\t\t\ttarget: null,\n\t\t\tstart: null,\n\t\t\tstop: null,\n\t\t\tleft: false,\n\t\t\tright: false,\n\t\t\trigid: false\n\t\t};\n\n\t\tvar self = this;\n\n\t\tfunction onMousemove(datum, index) {\n\n\t\t\tdrag.stop = self._getClientXFromEvent(d3.event, drag);\n\t\t\tvar distanceTraveled = drag.stop - drag.start;\n\t\t\tvar frameAfterDrag = self.frameBeforeDrag.slice(0);\n\t\t\tvar minimumFrameWidth = self.config.minimumFrameWidth;\n\n\t\t\tif (drag.rigid) {\n\t\t\t\tminimumFrameWidth = self.frameBeforeDrag[1] - self.frameBeforeDrag[0];\n\t\t\t}\n\t\t\tif (drag.left) {\n\t\t\t\tframeAfterDrag[0] = Math.max(frameAfterDrag[0] + distanceTraveled, 0);\n\t\t\t}\n\t\t\tif (drag.right) {\n\t\t\t\tframeAfterDrag[1] = Math.min(frameAfterDrag[1] + distanceTraveled, self.previewWidth);\n\t\t\t}\n\n\t\t\tvar currentFrameWidth = frameAfterDrag[1] - frameAfterDrag[0];\n\n\t\t\tif (currentFrameWidth <= minimumFrameWidth) {\n\n\t\t\t\tif (drag.left) {\n\t\t\t\t\tframeAfterDrag[0] = frameAfterDrag[1] - minimumFrameWidth;\n\t\t\t\t}\n\t\t\t\tif (drag.right) {\n\t\t\t\t\tframeAfterDrag[1] = frameAfterDrag[0] + minimumFrameWidth;\n\t\t\t\t}\n\t\t\t\tif (frameAfterDrag[0] <= 0) {\n\t\t\t\t\tframeAfterDrag[1] -= frameAfterDrag[0];\n\t\t\t\t\tframeAfterDrag[0] = 0;\n\t\t\t\t}\n\t\t\t\tif (frameAfterDrag[1] >= self.previewWidth) {\n\t\t\t\t\tframeAfterDrag[0] -= (frameAfterDrag[1] - self.previewWidth);\n\t\t\t\t\tframeAfterDrag[1] = self.previewWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tself.graphs.forEach(function(graph) {\n\n\t\t\t\tvar domainScale = d3.scale.linear()\n\t\t\t\t\t.interpolate(d3.interpolateNumber)\n\t\t\t\t\t.domain([0, self.previewWidth])\n\t\t\t\t\t.range(graph.dataDomain());\n\n\t\t\t\tvar windowAfterDrag = [\n\t\t\t\t\tdomainScale(frameAfterDrag[0]),\n\t\t\t\t\tdomainScale(frameAfterDrag[1])\n\t\t\t\t];\n\n\t\t\t\tself.slideCallbacks.forEach(function(callback) {\n\t\t\t\t\tcallback(graph, windowAfterDrag[0], windowAfterDrag[1]);\n\t\t\t\t});\n\n\t\t\t\tif (frameAfterDrag[0] === 0) {\n\t\t\t\t\twindowAfterDrag[0] = undefined;\n\t\t\t\t}\n\t\t\t\tif (frameAfterDrag[1] === self.previewWidth) {\n\t\t\t\t\twindowAfterDrag[1] = undefined;\n\t\t\t\t}\n\t\t\t\tgraph.window.xMin = windowAfterDrag[0];\n\t\t\t\tgraph.window.xMax = windowAfterDrag[1];\n\n\t\t\t\tgraph.update();\n\t\t\t});\n\t\t}\n\n\t\tfunction onMousedown() {\n\t\t\tdrag.target = d3.event.target;\n\t\t\tdrag.start = self._getClientXFromEvent(d3.event, drag);\n\t\t\tself.frameBeforeDrag = self.currentFrame.slice();\n\t\t\td3.event.preventDefault ? d3.event.preventDefault() : d3.event.returnValue = false;\n\t\t\td3.select(document).on(\"mousemove.rickshaw_range_slider_preview\", onMousemove);\n\t\t\td3.select(document).on(\"mouseup.rickshaw_range_slider_preview\", onMouseup);\n\t\t\td3.select(document).on(\"touchmove.rickshaw_range_slider_preview\", onMousemove);\n\t\t\td3.select(document).on(\"touchend.rickshaw_range_slider_preview\", onMouseup);\n\t\t\td3.select(document).on(\"touchcancel.rickshaw_range_slider_preview\", onMouseup);\n\t\t}\n\n\t\tfunction onMousedownLeftHandle(datum, index) {\n\t\t\tdrag.left = true;\n\t\t\tonMousedown();\n\t\t}\n\n\t\tfunction onMousedownRightHandle(datum, index) {\n\t\t\tdrag.right = true;\n\t\t\tonMousedown();\n\t\t}\n\n\t\tfunction onMousedownMiddleHandle(datum, index) {\n\t\t\tdrag.left = true;\n\t\t\tdrag.right = true;\n\t\t\tdrag.rigid = true;\n\t\t\tonMousedown();\n\t\t}\n\n\t\tfunction onMouseup(datum, index) {\n\t\t\td3.select(document).on(\"mousemove.rickshaw_range_slider_preview\", null);\n\t\t\td3.select(document).on(\"mouseup.rickshaw_range_slider_preview\", null);\n\t\t\td3.select(document).on(\"touchmove.rickshaw_range_slider_preview\", null);\n\t\t\td3.select(document).on(\"touchend.rickshaw_range_slider_preview\", null);\n\t\t\td3.select(document).on(\"touchcancel.rickshaw_range_slider_preview\", null);\n\t\t\tdelete self.frameBeforeDrag;\n\t\t\tdrag.left = false;\n\t\t\tdrag.right = false;\n\t\t\tdrag.rigid = false;\n\t\t}\n\n\t\telement.select(\"rect.left_handle\").on(\"mousedown\", onMousedownLeftHandle);\n\t\telement.select(\"rect.right_handle\").on(\"mousedown\", onMousedownRightHandle);\n\t\telement.select(\"rect.middle_handle\").on(\"mousedown\", onMousedownMiddleHandle);\n\t\telement.select(\"rect.left_handle\").on(\"touchstart\", onMousedownLeftHandle);\n\t\telement.select(\"rect.right_handle\").on(\"touchstart\", onMousedownRightHandle);\n\t\telement.select(\"rect.middle_handle\").on(\"touchstart\", onMousedownMiddleHandle);\n\t},\n\n\t_getClientXFromEvent: function(event, drag) {\n\n\t\tswitch (event.type) {\n\t\t\tcase 'touchstart':\n\t\t\tcase 'touchmove':\n\t\t\t\tvar touchList = event.changedTouches;\n\t\t\t\tvar touch = null;\n\t\t\t\tfor (var touchIndex = 0; touchIndex < touchList.length; touchIndex++) {\n\t\t\t\t\tif (touchList[touchIndex].target === drag.target) {\n\t\t\t\t\t\ttouch = touchList[touchIndex];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn touch !== null ? touch.clientX : undefined;\n\n\t\t\tdefault:\n\t\t\t\treturn event.clientX;\n\t\t}\n\t}\n});\n\nRickshaw.namespace(\"Rickshaw.Graph.Renderer\");\n\nRickshaw.Graph.Renderer = Rickshaw.Class.create( {\n\n\tinitialize: function(args) {\n\t\tthis.graph = args.graph;\n\t\tthis.tension = args.tension || this.tension;\n\t\tthis.configure(args);\n\t},\n\n\tseriesPathFactory: function() {\n\t\t//implement in subclass\n\t},\n\n\tseriesStrokeFactory: function() {\n\t\t// implement in subclass\n\t},\n\n\tdefaults: function() {\n\t\treturn {\n\t\t\ttension: 0.8,\n\t\t\tstrokeWidth: 2,\n\t\t\tunstack: true,\n\t\t\tpadding: { top: 0.01, right: 0, bottom: 0.01, left: 0 },\n\t\t\tstroke: false,\n\t\t\tfill: false,\n\t\t\topacity: 1\n\t\t};\n\t},\n\n\tdomain: function(data) {\n\t\t// Requires that at least one series contains some data\n\t\tvar stackedData = data || this.graph.stackedData || this.graph.stackData();\n\n\t\t// filter out any series that may be empty in the current x-domain\n\t\tstackedData = stackedData.filter(function (a) { return a && a.length !== 0; });\n\n\t\tvar xMin = +Infinity;\n\t\tvar xMax = -Infinity;\n\n\t\tvar yMin = +Infinity;\n\t\tvar yMax = -Infinity;\n\n\t\tstackedData.forEach( function(series) {\n\n\t\t\tseries.forEach( function(d) {\n\n\t\t\t\tif (d.y == null) return;\n\n\t\t\t\tvar y = d.y + d.y0;\n\n\t\t\t\tif (y < yMin) yMin = y;\n\t\t\t\tif (y > yMax) yMax = y;\n\t\t\t} );\n\n\t\t\tif (!series.length) return;\n\n\t\t\tif (series[0].x < xMin) xMin = series[0].x;\n\t\t\tif (series[series.length - 1].x > xMax) xMax = series[series.length - 1].x;\n\t\t} );\n\n\t\txMin -= (xMax - xMin) * this.padding.left;\n\t\txMax += (xMax - xMin) * this.padding.right;\n\n\t\tyMin = this.graph.min === 'auto' ? yMin : this.graph.min || 0;\n\t\tyMax = this.graph.max === undefined ? yMax : this.graph.max;\n\n\t\tif (this.graph.min === 'auto' || yMin < 0) {\n\t\t\tyMin -= (yMax - yMin) * this.padding.bottom;\n\t\t}\n\n\t\tif (this.graph.max === undefined) {\n\t\t\tyMax += (yMax - yMin) * this.padding.top;\n\t\t}\n\n\t\treturn { x: [xMin, xMax], y: [yMin, yMax] };\n\t},\n\n\trender: function(args) {\n\n\t\targs = args || {};\n\n\t\tvar graph = this.graph;\n\t\tvar series = args.series || graph.series;\n\n\t\tvar vis = args.vis || graph.vis;\n\t\tvis.selectAll('*').remove();\n\n\t\tvar data = series\n\t\t\t.filter(function(s) { return !s.disabled })\n\t\t\t.map(function(s) { return s.stack });\n\n\t\tvar pathNodes = vis.selectAll(\"path.path\")\n\t\t\t.data(data)\n\t\t\t.enter().append(\"svg:path\")\n\t\t\t.classed('path', true)\n\t\t\t.attr(\"d\", this.seriesPathFactory());\n\n\t\tif (this.stroke) {\n var strokeNodes = vis.selectAll('path.stroke')\n .data(data)\n .enter().append(\"svg:path\")\n\t\t\t\t.classed('stroke', true)\n\t\t\t\t.attr(\"d\", this.seriesStrokeFactory());\n\t\t}\n\n\t\tvar i = 0;\n\t\tseries.forEach( function(series) {\n\t\t\tif (series.disabled) return;\n\t\t\tseries.path = pathNodes[0][i];\n\t\t\tif (this.stroke) series.stroke = strokeNodes[0][i];\n\t\t\tthis._styleSeries(series);\n\t\t\ti++;\n\t\t}, this );\n\n\t},\n\n\t_styleSeries: function(series) {\n\n\t\tvar fill = this.fill ? series.color : 'none';\n\t\tvar stroke = this.stroke ? series.color : 'none';\n\t\tvar strokeWidth = series.strokeWidth ? series.strokeWidth : this.strokeWidth;\n\t\tvar opacity = series.opacity ? series.opacity : this.opacity;\n\n\t\tseries.path.setAttribute('fill', fill);\n\t\tseries.path.setAttribute('stroke', stroke);\n\t\tseries.path.setAttribute('stroke-width', strokeWidth);\n\t\tseries.path.setAttribute('opacity', opacity);\n\n\t\tif (series.className) {\n\t\t\td3.select(series.path).classed(series.className, true);\n\t\t}\n\t\tif (series.className && this.stroke) {\n\t\t\td3.select(series.stroke).classed(series.className, true);\n\t\t}\n\t},\n\n\tconfigure: function(args) {\n\n\t\targs = args || {};\n\n\t\tRickshaw.keys(this.defaults()).forEach( function(key) {\n\n\t\t\tif (!args.hasOwnProperty(key)) {\n\t\t\t\tthis[key] = this[key] || this.graph[key] || this.defaults()[key];\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof this.defaults()[key] == 'object') {\n\n\t\t\t\tRickshaw.keys(this.defaults()[key]).forEach( function(k) {\n\n\t\t\t\t\tthis[key][k] =\n\t\t\t\t\t\targs[key][k] !== undefined ? args[key][k] :\n\t\t\t\t\t\tthis[key][k] !== undefined ? this[key][k] :\n\t\t\t\t\t\tthis.defaults()[key][k];\n\t\t\t\t}, this );\n\n\t\t\t} else {\n\t\t\t\tthis[key] =\n\t\t\t\t\targs[key] !== undefined ? args[key] :\n\t\t\t\t\tthis[key] !== undefined ? this[key] :\n\t\t\t\t\tthis.graph[key] !== undefined ? this.graph[key] :\n\t\t\t\t\tthis.defaults()[key];\n\t\t\t}\n\n\t\t}, this );\n\t},\n\n\tsetStrokeWidth: function(strokeWidth) {\n\t\tif (strokeWidth !== undefined) {\n\t\t\tthis.strokeWidth = strokeWidth;\n\t\t}\n\t},\n\n\tsetTension: function(tension) {\n\t\tif (tension !== undefined) {\n\t\t\tthis.tension = tension;\n\t\t}\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.Renderer.Line');\n\nRickshaw.Graph.Renderer.Line = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {\n\n\tname: 'line',\n\n\tdefaults: function($super) {\n\n\t\treturn Rickshaw.extend( $super(), {\n\t\t\tunstack: true,\n\t\t\tfill: false,\n\t\t\tstroke: true\n\t\t} );\n\t},\n\n\tseriesPathFactory: function() {\n\n\t\tvar graph = this.graph;\n\n\t\tvar factory = d3.svg.line()\n\t\t\t.x( function(d) { return graph.x(d.x) } )\n\t\t\t.y( function(d) { return graph.y(d.y) } )\n\t\t\t.interpolate(this.graph.interpolation).tension(this.tension);\n\n\t\tfactory.defined && factory.defined( function(d) { return d.y !== null } );\n\t\treturn factory;\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.Renderer.Stack');\n\nRickshaw.Graph.Renderer.Stack = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {\n\n\tname: 'stack',\n\n\tdefaults: function($super) {\n\n\t\treturn Rickshaw.extend( $super(), {\n\t\t\tfill: true,\n\t\t\tstroke: false,\n\t\t\tunstack: false\n\t\t} );\n\t},\n\n\tseriesPathFactory: function() {\n\n\t\tvar graph = this.graph;\n\n\t\tvar factory = d3.svg.area()\n\t\t\t.x( function(d) { return graph.x(d.x) } )\n\t\t\t.y0( function(d) { return graph.y(d.y0) } )\n\t\t\t.y1( function(d) { return graph.y(d.y + d.y0) } )\n\t\t\t.interpolate(this.graph.interpolation).tension(this.tension);\n\n\t\tfactory.defined && factory.defined( function(d) { return d.y !== null } );\n\t\treturn factory;\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.Renderer.Bar');\n\nRickshaw.Graph.Renderer.Bar = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {\n\n\tname: 'bar',\n\n\tdefaults: function($super) {\n\n\t\tvar defaults = Rickshaw.extend( $super(), {\n\t\t\tgapSize: 0.05,\n\t\t\tunstack: false,\n\t\t\topacity: 1.0\n\t\t} );\n\n\t\tdelete defaults.tension;\n\t\treturn defaults;\n\t},\n\n\tinitialize: function($super, args) {\n\t\targs = args || {};\n\t\tthis.gapSize = args.gapSize || this.gapSize;\n\t\t$super(args);\n\t},\n\n\tdomain: function($super) {\n\n\t\tvar domain = $super();\n\n\t\tvar frequentInterval = this._frequentInterval(this.graph.stackedData.slice(-1).shift());\n\t\tdomain.x[1] += Number(frequentInterval.magnitude);\n\n\t\treturn domain;\n\t},\n\n\tbarWidth: function(series) {\n\n\t\tvar frequentInterval = this._frequentInterval(series.stack);\n\t\tvar barWidth = this.graph.x.magnitude(frequentInterval.magnitude) * (1 - this.gapSize);\n\n\t\treturn barWidth;\n\t},\n\n\trender: function(args) {\n\n\t\targs = args || {};\n\n\t\tvar graph = this.graph;\n\t\tvar series = args.series || graph.series;\n\n\t\tvar vis = args.vis || graph.vis;\n\t\tvis.selectAll('*').remove();\n\n\t\tvar barWidth = this.barWidth(series.active()[0]);\n\t\tvar barXOffset = 0;\n\n\t\tvar activeSeriesCount = series.filter( function(s) { return !s.disabled; } ).length;\n\t\tvar seriesBarWidth = this.unstack ? barWidth / activeSeriesCount : barWidth;\n\n\t\tvar transform = function(d) {\n\t\t\t// add a matrix transform for negative values\n\t\t\tvar matrix = [ 1, 0, 0, (d.y < 0 ? -1 : 1), 0, (d.y < 0 ? graph.y.magnitude(Math.abs(d.y)) * 2 : 0) ];\n\t\t\treturn \"matrix(\" + matrix.join(',') + \")\";\n\t\t};\n\n\t\tseries.forEach( function(series) {\n\n\t\t\tif (series.disabled) return;\n\n\t\t\tvar barWidth = this.barWidth(series);\n\n\t\t\tvar nodes = vis.selectAll(\"path\")\n\t\t\t\t.data(series.stack.filter( function(d) { return d.y !== null } ))\n\t\t\t\t.enter().append(\"svg:rect\")\n\t\t\t\t.attr(\"x\", function(d) { return graph.x(d.x) + barXOffset })\n\t\t\t\t.attr(\"y\", function(d) { return (graph.y(d.y0 + Math.abs(d.y))) * (d.y < 0 ? -1 : 1 ) })\n\t\t\t\t.attr(\"width\", seriesBarWidth)\n\t\t\t\t.attr(\"height\", function(d) { return graph.y.magnitude(Math.abs(d.y)) })\n\t\t\t\t.attr(\"opacity\", series.opacity)\n\t\t\t\t.attr(\"transform\", transform);\n\n\t\t\tArray.prototype.forEach.call(nodes[0], function(n) {\n\t\t\t\tn.setAttribute('fill', series.color);\n\t\t\t} );\n\n\t\t\tif (this.unstack) barXOffset += seriesBarWidth;\n\n\t\t}, this );\n\t},\n\n\t_frequentInterval: function(data) {\n\n\t\tvar intervalCounts = {};\n\n\t\tfor (var i = 0; i < data.length - 1; i++) {\n\t\t\tvar interval = data[i + 1].x - data[i].x;\n\t\t\tintervalCounts[interval] = intervalCounts[interval] || 0;\n\t\t\tintervalCounts[interval]++;\n\t\t}\n\n\t\tvar frequentInterval = { count: 0, magnitude: 1 };\n\t\t\n\t\t// Sorting object's keys returned to guarantee consistency when iterating over\n\t\t// Keys order in `for .. in` loop is not specified and browsers behave differently here\n\t\t// This results with different invterval value being calculated for different browsers\n\t\t// See last but one section here: http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.4\n\t\tvar keysSorted = Rickshaw.keys(intervalCounts).sort(function asc(a, b) { return Number(a) - Number(b); });\n\t\tkeysSorted.forEach( function(i) {\n\t\t\tif (frequentInterval.count < intervalCounts[i]) {\n\t\t\t\tfrequentInterval = {\n\t\t\t\t\tcount: intervalCounts[i],\n\t\t\t\t\tmagnitude: i\n\t\t\t\t};\n\t\t\t}\n\t\t} );\n\n\t\treturn frequentInterval;\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.Renderer.Area');\n\nRickshaw.Graph.Renderer.Area = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {\n\n\tname: 'area',\n\n\tdefaults: function($super) {\n\n\t\treturn Rickshaw.extend( $super(), {\n\t\t\tunstack: false,\n\t\t\tfill: false,\n\t\t\tstroke: false\n\t\t} );\n\t},\n\n\tseriesPathFactory: function() {\n\n\t\tvar graph = this.graph;\n\n\t\tvar factory = d3.svg.area()\n\t\t\t.x( function(d) { return graph.x(d.x) } )\n\t\t\t.y0( function(d) { return graph.y(d.y0) } )\n\t\t\t.y1( function(d) { return graph.y(d.y + d.y0) } )\n\t\t\t.interpolate(graph.interpolation).tension(this.tension);\n\n\t\tfactory.defined && factory.defined( function(d) { return d.y !== null } );\n\t\treturn factory;\n\t},\n\n\tseriesStrokeFactory: function() {\n\n\t\tvar graph = this.graph;\n\n\t\tvar factory = d3.svg.line()\n\t\t\t.x( function(d) { return graph.x(d.x) } )\n\t\t\t.y( function(d) { return graph.y(d.y + d.y0) } )\n\t\t\t.interpolate(graph.interpolation).tension(this.tension);\n\n\t\tfactory.defined && factory.defined( function(d) { return d.y !== null } );\n\t\treturn factory;\n\t},\n\n\trender: function(args) {\n\n\t\targs = args || {};\n\n\t\tvar graph = this.graph;\n\t\tvar series = args.series || graph.series;\n\n\t\tvar vis = args.vis || graph.vis;\n\t\tvis.selectAll('*').remove();\n\n\t\t// insert or stacked areas so strokes lay on top of areas\n\t\tvar method = this.unstack ? 'append' : 'insert';\n\n\t\tvar data = series\n\t\t\t.filter(function(s) { return !s.disabled })\n\t\t\t.map(function(s) { return s.stack });\n\n\t\tvar nodes = vis.selectAll(\"path\")\n\t\t\t.data(data)\n\t\t\t.enter()[method](\"svg:g\", 'g');\n\n\t\tnodes.append(\"svg:path\")\n\t\t\t.attr(\"d\", this.seriesPathFactory())\n\t\t\t.attr(\"class\", 'area');\n\n\t\tif (this.stroke) {\n\t\t\tnodes.append(\"svg:path\")\n\t\t\t\t.attr(\"d\", this.seriesStrokeFactory())\n\t\t\t\t.attr(\"class\", 'line');\n\t\t}\n\n\t\tvar i = 0;\n\t\tseries.forEach( function(series) {\n\t\t\tif (series.disabled) return;\n\t\t\tseries.path = nodes[0][i++];\n\t\t\tthis._styleSeries(series);\n\t\t}, this );\n\t},\n\n\t_styleSeries: function(series) {\n\n\t\tif (!series.path) return;\n\n\t\td3.select(series.path).select('.area')\n\t\t\t.attr('fill', series.color);\n\n\t\tif (this.stroke) {\n\t\t\td3.select(series.path).select('.line')\n\t\t\t\t.attr('fill', 'none')\n\t\t\t\t.attr('stroke', series.stroke || d3.interpolateRgb(series.color, 'black')(0.125))\n\t\t\t\t.attr('stroke-width', this.strokeWidth);\n\t\t}\n\n\t\tif (series.className) {\n\t\t\tseries.path.setAttribute('class', series.className);\n\t\t}\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.Renderer.ScatterPlot');\n\nRickshaw.Graph.Renderer.ScatterPlot = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {\n\n\tname: 'scatterplot',\n\n\tdefaults: function($super) {\n\n\t\treturn Rickshaw.extend( $super(), {\n\t\t\tunstack: true,\n\t\t\tfill: true,\n\t\t\tstroke: false,\n\t\t\tpadding:{ top: 0.01, right: 0.01, bottom: 0.01, left: 0.01 },\n\t\t\tdotSize: 4\n\t\t} );\n\t},\n\n\tinitialize: function($super, args) {\n\t\t$super(args);\n\t},\n\n\trender: function(args) {\n\n\t\targs = args || {};\n\n\t\tvar graph = this.graph;\n\n\t\tvar series = args.series || graph.series;\n\t\tvar vis = args.vis || graph.vis;\n\n\t\tvar dotSize = this.dotSize;\n\n\t\tvis.selectAll('*').remove();\n\n\t\tseries.forEach( function(series) {\n\n\t\t\tif (series.disabled) return;\n\t\t\tvar opacity = series.opacity ? series.opacity : 1;\n\n\t\t\tvar nodes = vis.selectAll(\"path\")\n\t\t\t\t.data(series.stack.filter( function(d) { return d.y !== null } ))\n\t\t\t\t.enter().append(\"svg:circle\")\n\t\t\t\t\t.attr(\"cx\", function(d) { return graph.x(d.x) })\n\t\t\t\t\t.attr(\"cy\", function(d) { return graph.y(d.y) })\n\t\t\t\t\t.attr(\"r\", function(d) { return (\"r\" in d) ? d.r : dotSize})\n\t\t\t\t\t.attr(\"opacity\", function(d) { return (\"opacity\" in d) ? d.opacity : opacity});\n\t\t\tif (series.className) {\n\t\t\t\tnodes.classed(series.className, true);\n\t\t\t}\n\t\t\t\n\t\t\tArray.prototype.forEach.call(nodes[0], function(n) {\n\t\t\t\tn.setAttribute('fill', series.color);\n\t\t\t} );\n\n\t\t}, this );\n\t}\n} );\nRickshaw.namespace('Rickshaw.Graph.Renderer.Multi');\n\nRickshaw.Graph.Renderer.Multi = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {\n\n\tname: 'multi',\n\n\tinitialize: function($super, args) {\n\n\t\t$super(args);\n\t},\n\n\tdefaults: function($super) {\n\n\t\treturn Rickshaw.extend( $super(), {\n\t\t\tunstack: true,\n\t\t\tfill: false,\n\t\t\tstroke: true \n\t\t} );\n\t},\n\n\tconfigure: function($super, args) {\n\n\t\targs = args || {};\n\t\tthis.config = args;\n\t\t$super(args);\n\t},\n\n\tdomain: function($super) {\n\n\t\tthis.graph.stackData();\n\n\t\tvar domains = [];\n\n\t\tvar groups = this._groups();\n\t\tthis._stack(groups);\n\n\t\tgroups.forEach( function(group) {\n\n\t\t\tvar data = group.series\n\t\t\t\t.filter( function(s) { return !s.disabled } )\n\t\t\t\t.map( function(s) { return s.stack });\n\n\t\t\tif (!data.length) return;\n\t\t\t\n\t\t\tvar domain = null;\n\t\t\tif (group.renderer && group.renderer.domain) {\n\t\t\t\tdomain = group.renderer.domain(data);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdomain = $super(data);\n\t\t\t}\n\t\t\tdomains.push(domain);\n\t\t});\n\n\t\tvar xMin = d3.min(domains.map( function(d) { return d.x[0] } ));\n\t\tvar xMax = d3.max(domains.map( function(d) { return d.x[1] } ));\n\t\tvar yMin = d3.min(domains.map( function(d) { return d.y[0] } ));\n\t\tvar yMax = d3.max(domains.map( function(d) { return d.y[1] } ));\n\n\t\treturn { x: [xMin, xMax], y: [yMin, yMax] };\n\t},\n\n\t_groups: function() {\n\n\t\tvar graph = this.graph;\n\n\t\tvar renderGroups = {};\n\n\t\tgraph.series.forEach( function(series) {\n\n\t\t\tif (series.disabled) return;\n\n\t\t\tif (!renderGroups[series.renderer]) {\n\n\t\t\t\tvar ns = \"http://www.w3.org/2000/svg\";\n\t\t\t\tvar vis = document.createElementNS(ns, 'g');\n\n\t\t\t\tgraph.vis[0][0].appendChild(vis);\n\n\t\t\t\tvar renderer = graph._renderers[series.renderer];\n\n\t\t\t\tvar config = {};\n\n\t\t\t\tvar defaults = [ this.defaults(), renderer.defaults(), this.config, this.graph ];\n\t\t\t\tdefaults.forEach(function(d) { Rickshaw.extend(config, d) });\n\n\t\t\t\trenderer.configure(config);\n\n\t\t\t\trenderGroups[series.renderer] = {\n\t\t\t\t\trenderer: renderer,\n\t\t\t\t\tseries: [],\n\t\t\t\t\tvis: d3.select(vis)\n\t\t\t\t};\n\t\t\t}\n\t\t\t\t\n\t\t\trenderGroups[series.renderer].series.push(series);\n\n\t\t}, this);\n\n\t\tvar groups = [];\n\n\t\tObject.keys(renderGroups).forEach( function(key) {\n\t\t\tvar group = renderGroups[key];\n\t\t\tgroups.push(group);\n\t\t});\n\n\t\treturn groups;\n\t},\n\n\t_stack: function(groups) {\n\n\t\tgroups.forEach( function(group) {\n\n\t\t\tvar series = group.series\n\t\t\t\t.filter( function(series) { return !series.disabled } );\n\n\t\t\tvar data = series\n\t\t\t\t.map( function(series) { return series.stack } );\n\n\t\t\tif (!group.renderer.unstack) {\n\n\t\t\t\tvar layout = d3.layout.stack();\n\t\t\t\tvar stackedData = Rickshaw.clone(layout(data));\n\n\t\t\t\tseries.forEach( function(series, index) {\n\t\t\t\t\tseries._stack = Rickshaw.clone(stackedData[index]);\n\t\t\t\t});\n\t\t\t}\n\n\t\t}, this );\n\n\t\treturn groups;\n\n\t},\n\n\trender: function() {\n\n\t\tthis.graph.series.forEach( function(series) {\n\t\t\tif (!series.renderer) {\n\t\t\t\tthrow new Error(\"Each series needs a renderer for graph 'multi' renderer\");\n\t\t\t}\n\t\t});\n\n\t\tthis.graph.vis.selectAll('*').remove();\n\n\t\tvar groups = this._groups();\n\t\tgroups = this._stack(groups);\n\n\t\tgroups.forEach( function(group) {\n\n\t\t\tvar series = group.series\n\t\t\t\t.filter( function(series) { return !series.disabled } );\n\n\t\t\tseries.active = function() { return series };\n\n\t\t\tgroup.renderer.render({ series: series, vis: group.vis });\n\t\t\tseries.forEach(function(s) { s.stack = s._stack || s.stack || s.data; });\n\t\t});\n\t}\n\n} );\nRickshaw.namespace('Rickshaw.Graph.Renderer.LinePlot');\n\nRickshaw.Graph.Renderer.LinePlot = Rickshaw.Class.create( Rickshaw.Graph.Renderer, {\n\n\tname: 'lineplot',\n\n\tdefaults: function($super) {\n\n\t\treturn Rickshaw.extend( $super(), {\n\t\t\tunstack: true,\n\t\t\tfill: false,\n\t\t\tstroke: true,\n\t\t\tpadding:{ top: 0.01, right: 0.01, bottom: 0.01, left: 0.01 },\n\t\t\tdotSize: 3,\n\t\t\tstrokeWidth: 2\n\t\t} );\n\t},\n\n\tseriesPathFactory: function() {\n\n\t\tvar graph = this.graph;\n\n\t\tvar factory = d3.svg.line()\n\t\t\t.x( function(d) { return graph.x(d.x) } )\n\t\t\t.y( function(d) { return graph.y(d.y) } )\n\t\t\t.interpolate(this.graph.interpolation).tension(this.tension);\n\n\t\tfactory.defined && factory.defined( function(d) { return d.y !== null } );\n\t\treturn factory;\n\t},\n\n\trender: function(args) {\n\n\t\targs = args || {};\n\n\t\tvar graph = this.graph;\n\n\t\tvar series = args.series || graph.series;\n\t\tvar vis = args.vis || graph.vis;\n\n\t\tvar dotSize = this.dotSize;\n\n\t\tvis.selectAll('*').remove();\n\n\t\tvar data = series\n\t\t\t.filter(function(s) { return !s.disabled })\n\t\t\t.map(function(s) { return s.stack });\n\n\t\tvar nodes = vis.selectAll(\"path\")\n\t\t\t.data(data)\n\t\t\t.enter().append(\"svg:path\")\n\t\t\t.attr(\"d\", this.seriesPathFactory());\n\n\t\tvar i = 0;\n\t\tseries.forEach(function(series) {\n\t\t\tif (series.disabled) return;\n\t\t\tseries.path = nodes[0][i++];\n\t\t\tthis._styleSeries(series);\n\t\t}, this);\n\n\t\tseries.forEach(function(series) {\n\n\t\t\tif (series.disabled) return;\n\n\t\t\tvar nodes = vis.selectAll(\"x\")\n\t\t\t\t.data(series.stack.filter( function(d) { return d.y !== null } ))\n\t\t\t\t.enter().append(\"svg:circle\")\n\t\t\t\t.attr(\"cx\", function(d) { return graph.x(d.x) })\n\t\t\t\t.attr(\"cy\", function(d) { return graph.y(d.y) })\n\t\t\t\t.attr(\"r\", function(d) { return (\"r\" in d) ? d.r : dotSize});\n\n\t\t\tArray.prototype.forEach.call(nodes[0], function(n) {\n\t\t\t\tif (!n) return;\n\t\t\t\tn.setAttribute('data-color', series.color);\n\t\t\t\tn.setAttribute('fill', 'white');\n\t\t\t\tn.setAttribute('stroke', series.color);\n\t\t\t\tn.setAttribute('stroke-width', this.strokeWidth);\n\n\t\t\t}.bind(this));\n\n\t\t}, this);\n\t}\n} );\n\nRickshaw.namespace('Rickshaw.Graph.Smoother');\n\nRickshaw.Graph.Smoother = Rickshaw.Class.create({\n\n\tinitialize: function(args) {\n\n\t\tthis.graph = args.graph;\n\t\tthis.element = args.element;\n\t\tthis.aggregationScale = 1;\n\n\t\tthis.build();\n\n\t\tthis.graph.stackData.hooks.data.push( {\n\t\t\tname: 'smoother',\n\t\t\torderPosition: 50,\n\t\t\tf: this.transformer.bind(this)\n\t\t} );\n\t},\n\n\tbuild: function() {\n\n\t\tvar self = this;\n\t\tvar $ = jQuery;\n\n\t\tif (this.element) {\n\t\t\t$( function() {\n\t\t\t\t$(self.element).slider( {\n\t\t\t\t\tmin: 1,\n\t\t\t\t\tmax: 100,\n\t\t\t\t\tslide: function( event, ui ) {\n\t\t\t\t\t\tself.setScale(ui.value);\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\t},\n\n\tsetScale: function(scale) {\n\n\t\tif (scale < 1) {\n\t\t\tthrow \"scale out of range: \" + scale;\n\t\t}\n\n\t\tthis.aggregationScale = scale;\n\t\tthis.graph.update();\n\t},\n\n\ttransformer: function(data) {\n\n\t\tif (this.aggregationScale == 1) return data;\n\n\t\tvar aggregatedData = [];\n\n\t\tdata.forEach( function(seriesData) {\n\n\t\t\tvar aggregatedSeriesData = [];\n\n\t\t\twhile (seriesData.length) {\n\n\t\t\t\tvar avgX = 0, avgY = 0;\n\t\t\t\tvar slice = seriesData.splice(0, this.aggregationScale);\n\n\t\t\t\tslice.forEach( function(d) {\n\t\t\t\t\tavgX += d.x / slice.length;\n\t\t\t\t\tavgY += d.y / slice.length;\n\t\t\t\t} );\n\n\t\t\t\taggregatedSeriesData.push( { x: avgX, y: avgY } );\n\t\t\t}\n\n\t\t\taggregatedData.push(aggregatedSeriesData);\n\n\t\t}.bind(this) );\n\n\t\treturn aggregatedData;\n\t}\n});\n\nRickshaw.namespace('Rickshaw.Graph.Socketio');\n\nRickshaw.Graph.Socketio = Rickshaw.Class.create( Rickshaw.Graph.Ajax, {\n\trequest: function() {\n\t\tvar socket = io.connect(this.dataURL);\n\t\tvar self = this;\n\t\tsocket.on('rickshaw', function (data) {\n\t\t\tself.success(data);\n\t\t});\n\t}\n} );\nRickshaw.namespace('Rickshaw.Series');\n\nRickshaw.Series = Rickshaw.Class.create( Array, {\n\n\tinitialize: function (data, palette, options) {\n\n\t\toptions = options || {};\n\n\t\tthis.palette = new Rickshaw.Color.Palette(palette);\n\n\t\tthis.timeBase = typeof(options.timeBase) === 'undefined' ? \n\t\t\tMath.floor(new Date().getTime() / 1000) : \n\t\t\toptions.timeBase;\n\n\t\tvar timeInterval = typeof(options.timeInterval) == 'undefined' ?\n\t\t\t1000 :\n\t\t\toptions.timeInterval;\n\n\t\tthis.setTimeInterval(timeInterval);\n\n\t\tif (data && (typeof(data) == \"object\") && Array.isArray(data)) {\n\t\t\tdata.forEach( function(item) { this.addItem(item) }, this );\n\t\t}\n\t},\n\n\taddItem: function(item) {\n\n\t\tif (typeof(item.name) === 'undefined') {\n\t\t\tthrow('addItem() needs a name');\n\t\t}\n\n\t\titem.color = (item.color || this.palette.color(item.name));\n\t\titem.data = (item.data || []);\n\n\t\t// backfill, if necessary\n\t\tif ((item.data.length === 0) && this.length && (this.getIndex() > 0)) {\n\t\t\tthis[0].data.forEach( function(plot) {\n\t\t\t\titem.data.push({ x: plot.x, y: 0 });\n\t\t\t} );\n\t\t} else if (item.data.length === 0) {\n\t\t\titem.data.push({ x: this.timeBase - (this.timeInterval || 0), y: 0 });\n\t\t} \n\n\t\tthis.push(item);\n\n\t\tif (this.legend) {\n\t\t\tthis.legend.addLine(this.itemByName(item.name));\n\t\t}\n\t},\n\n\taddData: function(data, x) {\n\n\t\tvar index = this.getIndex();\n\n\t\tRickshaw.keys(data).forEach( function(name) {\n\t\t\tif (! this.itemByName(name)) {\n\t\t\t\tthis.addItem({ name: name });\n\t\t\t}\n\t\t}, this );\n\n\t\tthis.forEach( function(item) {\n\t\t\titem.data.push({ \n\t\t\t\tx: x || (index * this.timeInterval || 1) + this.timeBase, \n\t\t\t\ty: (data[item.name] || 0) \n\t\t\t});\n\t\t}, this );\n\t},\n\n\tgetIndex: function () {\n\t\treturn (this[0] && this[0].data && this[0].data.length) ? this[0].data.length : 0;\n\t},\n\n\titemByName: function(name) {\n\n\t\tfor (var i = 0; i < this.length; i++) {\n\t\t\tif (this[i].name == name)\n\t\t\t\treturn this[i];\n\t\t}\n\t},\n\n\tsetTimeInterval: function(iv) {\n\t\tthis.timeInterval = iv / 1000;\n\t},\n\n\tsetTimeBase: function (t) {\n\t\tthis.timeBase = t;\n\t},\n\n\tdump: function() {\n\n\t\tvar data = {\n\t\t\ttimeBase: this.timeBase,\n\t\t\ttimeInterval: this.timeInterval,\n\t\t\titems: []\n\t\t};\n\n\t\tthis.forEach( function(item) {\n\n\t\t\tvar newItem = {\n\t\t\t\tcolor: item.color,\n\t\t\t\tname: item.name,\n\t\t\t\tdata: []\n\t\t\t};\n\n\t\t\titem.data.forEach( function(plot) {\n\t\t\t\tnewItem.data.push({ x: plot.x, y: plot.y });\n\t\t\t} );\n\n\t\t\tdata.items.push(newItem);\n\t\t} );\n\n\t\treturn data;\n\t},\n\n\tload: function(data) {\n\n\t\tif (data.timeInterval) {\n\t\t\tthis.timeInterval = data.timeInterval;\n\t\t}\n\n\t\tif (data.timeBase) {\n\t\t\tthis.timeBase = data.timeBase;\n\t\t}\n\n\t\tif (data.items) {\n\t\t\tdata.items.forEach( function(item) {\n\t\t\t\tthis.push(item);\n\t\t\t\tif (this.legend) {\n\t\t\t\t\tthis.legend.addLine(this.itemByName(item.name));\n\t\t\t\t}\n\n\t\t\t}, this );\n\t\t}\n\t}\n} );\n\nRickshaw.Series.zeroFill = function(series) {\n\tRickshaw.Series.fill(series, 0);\n};\n\nRickshaw.Series.fill = function(series, fill) {\n\n\tvar x;\n\tvar i = 0;\n\n\tvar data = series.map( function(s) { return s.data } );\n\n\twhile ( i < Math.max.apply(null, data.map( function(d) { return d.length } )) ) {\n\n\t\tx = Math.min.apply( null, \n\t\t\tdata\n\t\t\t\t.filter(function(d) { return d[i] })\n\t\t\t\t.map(function(d) { return d[i].x })\n\t\t);\n\n\t\tdata.forEach( function(d) {\n\t\t\tif (!d[i] || d[i].x != x) {\n\t\t\t\td.splice(i, 0, { x: x, y: fill });\n\t\t\t}\n\t\t} );\n\n\t\ti++;\n\t}\n};\n\nRickshaw.namespace('Rickshaw.Series.FixedDuration');\n\nRickshaw.Series.FixedDuration = Rickshaw.Class.create(Rickshaw.Series, {\n\n\tinitialize: function (data, palette, options) {\n\n\t\toptions = options || {};\n\n\t\tif (typeof(options.timeInterval) === 'undefined') {\n\t\t\tthrow new Error('FixedDuration series requires timeInterval');\n\t\t}\n\n\t\tif (typeof(options.maxDataPoints) === 'undefined') {\n\t\t\tthrow new Error('FixedDuration series requires maxDataPoints');\n\t\t}\n\n\t\tthis.palette = new Rickshaw.Color.Palette(palette);\n\t\tthis.timeBase = typeof(options.timeBase) === 'undefined' ? Math.floor(new Date().getTime() / 1000) : options.timeBase;\n\t\tthis.setTimeInterval(options.timeInterval);\n\n\t\tif (this[0] && this[0].data && this[0].data.length) {\n\t\t\tthis.currentSize = this[0].data.length;\n\t\t\tthis.currentIndex = this[0].data.length;\n\t\t} else {\n\t\t\tthis.currentSize = 0;\n\t\t\tthis.currentIndex = 0;\n\t\t}\n\n\t\tthis.maxDataPoints = options.maxDataPoints;\n\n\n\t\tif (data && (typeof(data) == \"object\") && Array.isArray(data)) {\n\t\t\tdata.forEach( function (item) { this.addItem(item) }, this );\n\t\t\tthis.currentSize += 1;\n\t\t\tthis.currentIndex += 1;\n\t\t}\n\n\t\t// reset timeBase for zero-filled values if needed\n\t\tthis.timeBase -= (this.maxDataPoints - this.currentSize) * this.timeInterval;\n\n\t\t// zero-fill up to maxDataPoints size if we don't have that much data yet\n\t\tif ((typeof(this.maxDataPoints) !== 'undefined') && (this.currentSize < this.maxDataPoints)) {\n\t\t\tfor (var i = this.maxDataPoints - this.currentSize - 1; i > 1; i--) {\n\t\t\t\tthis.currentSize += 1;\n\t\t\t\tthis.currentIndex += 1;\n\t\t\t\tthis.forEach( function (item) {\n\t\t\t\t\titem.data.unshift({ x: ((i-1) * this.timeInterval || 1) + this.timeBase, y: 0, i: i });\n\t\t\t\t}, this );\n\t\t\t}\n\t\t}\n\t},\n\n\taddData: function($super, data, x) {\n\n\t\t$super(data, x);\n\n\t\tthis.currentSize += 1;\n\t\tthis.currentIndex += 1;\n\n\t\tif (this.maxDataPoints !== undefined) {\n\t\t\twhile (this.currentSize > this.maxDataPoints) {\n\t\t\t\tthis.dropData();\n\t\t\t}\n\t\t}\n\t},\n\n\tdropData: function() {\n\n\t\tthis.forEach(function(item) {\n\t\t\titem.data.splice(0, 1);\n\t\t} );\n\n\t\tthis.currentSize -= 1;\n\t},\n\n\tgetIndex: function () {\n\t\treturn this.currentIndex;\n\t}\n} );\n\n\treturn Rickshaw;\n}));\n })();\n});","// Brunch automatically concatenates all files in your\n// watched paths. Those paths can be configured at\n// config.paths.watched in \"brunch-config.js\".\n//\n// However, those files will only be executed if\n// explicitly imported. The only exception are files\n// in vendor, which are never wrapped in imports and\n// therefore are always executed.\n\n// Import dependencies\n//\n// If you no longer want to use a dependency, remember\n// to also remove its path from \"config.paths.watched\".\nimport \"phoenix_html\"\nimport \"rickshaw\"\n\n\n// Import local files\n//\n// Local files can be imported directly using relative\n// paths \"./socket\" or full ones \"web/static/js/socket\".\n\nimport \"./main\"\n","import PageIndex from \"./page_index\"\nimport QueuesIndex from \"./queues_index\"\n\nconst views = {\n PageIndex, QueuesIndex\n}\n\nfunction handleDOMContentLoaded() {\n const viewName = document.getElementsByTagName('body')[0].dataset.jsViewPath;\n\n views[viewName].init();\n}\n\nwindow.addEventListener('DOMContentLoaded', handleDOMContentLoaded, false);\n","import {Socket, LongPoller} from \"phoenix\"\nimport Rickshaw from \"rickshaw\"\n\nclass PageIndex {\n static init() {\n let graph = new Rickshaw.Graph({\n element: document.querySelector(\"#graph\"),\n renderer: 'area',\n stroke: true,\n series: new Rickshaw.Series.FixedDuration([{\n name: 'finished', color: 'steelblue'\n },\n {\n name: 'failed', color: 'lightcoral'\n }], undefined, {\n timeInterval: 1000,\n maxDataPoints: 120,\n timeBase: new Date().getTime() / 1000\n })\n })\n\n let hoverDetail = new Rickshaw.Graph.HoverDetail( {\n graph: graph,\n xFormatter: x => {\n return new Date(x * 1000).toString()\n },\n yFormatter: y => {\n return parseInt(y)\n }\n })\n\n let socket = new Socket(MOUNT_PATH + \"/socket\")\n socket.connect()\n\n let chan = socket.channel(\"rooms:jobs\", {})\n chan.join()\n\n chan.on(\"job:stats\", msg => {\n graph.series.addData(msg)\n graph.render()\n })\n }\n}\n\nexport default PageIndex\n","import {Socket, LongPoller} from \"phoenix\"\n\nclass QueuesIndex {\n static init() {\n let socket = new Socket(MOUNT_PATH + \"/socket\")\n socket.connect()\n\n let chan = socket.channel(\"rooms:queues\", {})\n chan.join()\n\n $(\".queue_control form\").each((n, el) => {\n let form = $(el)\n form.on(\"submit\", () => {\n $.post(form.attr(\"action\"), form.serialize())\n return false\n });\n })\n\n chan.on(\"queue:status\", msg => {\n let queue = msg[\"queue\"],\n status = msg[\"status\"],\n button = $(`td#queue_${queue}_control button:first`),\n form = $(button.parent()),\n row = $(`tr.queue-${queue}`)\n\n if (row.size() === 0) return\n\n row.removeClass(\"running pausing paused\")\n row.addClass(status)\n\n if (status === \"running\") {\n form.attr(\"action\", `/queues/${queue}/pause`)\n button.html(\"Pause\")\n button.removeAttr(\"disabled\")\n } else if (status === \"pausing\") {\n form.attr(\"action\", \"\")\n button.html(\"Pausing...\")\n button.attr(\"disabled\", \"disabled\")\n } else if (status === \"paused\") {\n form.attr(\"action\", `/queues/${queue}/resume`)\n button.html(\"Resume\")\n button.removeAttr(\"disabled\")\n }\n })\n }\n}\n\nexport default QueuesIndex\n","/*!\n * jQuery JavaScript Library v2.2.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-05-20T17:23Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\"use strict\";\nvar arr = [];\n\nvar document = window.document;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\tversion = \"2.2.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = jQuery.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type( obj ) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\tvar realStringObj = obj && obj.toString();\n\t\treturn !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Not own constructor property must be Object\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj, \"constructor\" ) &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype || {}, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf( \"use strict\" ) === 1 ) {\n\t\t\t\tscript = document.createElement( \"script\" );\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\n\t\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t\t// and removal by using an indirect global eval\n\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\n// JSHint would error on this code due to the Symbol not being defined in ES5.\n// Defining this global in .jshintrc would create a danger of using the global\n// unguarded in another place, it seems safer to just disable JSHint for these\n// three lines.\n/* jshint ignore: start */\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n/* jshint ignore: end */\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.1\n * http://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-10-17\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, nidselect, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\tnidselect = ridentifier.test( nid ) ? \"#\" + nid : \"[id='\" + nid + \"']\";\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = nidselect + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( (parent = document.defaultView) && parent.top !== parent ) {\n\t\t// Support: IE 11\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\treturn m ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"\" +\n\t\t\t\t\"\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( (oldCache = uniqueCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: ) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = ( /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/ );\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t} );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && ( pos ?\n\t\t\t\t\tpos.index( cur ) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnotwhite = ( /\\S+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( jQuery.isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ) ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis === promise ? newDefer.promise() : this,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add( function() {\n\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 ||\n\t\t\t\t( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred.\n\t\t\t// If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) )\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n} );\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n} );\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called\n\t\t// after the browser event has already occurred.\n\t\t// Support: IE9-10 only\n\t\t// Older IE sometimes signals \"interactive\" too soon\n\t\tif ( document.readyState === \"complete\" ||\n\t\t\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\twindow.setTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[ 0 ], key ) : emptyGet;\n};\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tregister: function( owner, initial ) {\n\t\tvar value = initial || {};\n\n\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t// use plain assignment\n\t\tif ( owner.nodeType ) {\n\t\t\towner[ this.expando ] = value;\n\n\t\t// Otherwise secure it in a non-enumerable, non-writable property\n\t\t// configurability must be true to allow the property to be\n\t\t// deleted with the delete operator\n\t\t} else {\n\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\tvalue: value,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true\n\t\t\t} );\n\t\t}\n\t\treturn owner[ this.expando ];\n\t},\n\tcache: function( owner ) {\n\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return an empty object.\n\t\tif ( !acceptData( owner ) ) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\t\t\towner[ this.expando ] && owner[ this.expando ][ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase( key ) );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.register( owner );\n\n\t\t} else {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <= 35-45+\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://code.google.com/p/chromium/issues/detail?id=378607\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data, camelKey;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = dataUser.get( elem, key ) ||\n\n\t\t\t\t\t// Try to find dashed key if it exists (gh-2779)\n\t\t\t\t\t// This is for 2.2.x only\n\t\t\t\t\tdataUser.get( elem, key.replace( rmultiDash, \"-$&\" ).toLowerCase() );\n\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = dataUser.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tcamelKey = jQuery.camelCase( key );\n\t\t\tthis.each( function() {\n\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = dataUser.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdataUser.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf( \"-\" ) > -1 && data !== undefined ) {\n\t\t\t\t\tdataUser.set( this, key, value );\n\t\t\t\t}\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" ||\n\t\t\t!jQuery.contains( elem.ownerDocument, elem );\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted,\n\t\tscale = 1,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() { return tween.cur(); } :\n\t\t\tfunction() { return jQuery.css( elem, prop, \"\" ); },\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\tdo {\n\n\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\tscale = scale || \".5\";\n\n\t\t\t// Adjust and apply\n\t\t\tinitialInUnit = initialInUnit / scale;\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t// Break the loop if scale is unchanged or perfect, or if we've just had enough.\n\t\t} while (\n\t\t\tscale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\n\t\t);\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([\\w:-]+)/ );\n\nvar rscriptType = ( /^$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE9\n\toption: [ 1, \"\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
\" ],\n\tcol: [ 2, \"\", \"
\" ],\n\ttr: [ 2, \"\", \"
\" ],\n\ttd: [ 3, \"\", \"
\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE9-11+\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== \"undefined\" ?\n\t\t\t\tcontext.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0-4.3, Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE9\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Support (at least): Chrome, IE9\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG instance trees (#13180)\n\t\t//\n\t\t// Support: Firefox<=42+\n\t\t// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\n\t\tif ( delegateCount && cur.nodeType &&\n\t\t\t( event.type !== \"click\" || isNaN( event.button ) || event.button < 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \"click\" ) ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matches } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: ( \"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \" +\n\t\t\"metaKey relatedTarget shiftKey target timeStamp view which\" ).split( \" \" ),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split( \" \" ),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: ( \"button buttons clientX clientY offsetX offsetY pageX pageY \" +\n\t\t\t\"screenX screenY toElement\" ).split( \" \" ),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX +\n\t\t\t\t\t( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\n\t\t\t\t\t( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY +\n\t\t\t\t\t( doc && doc.scrollTop || body && body.scrollTop || 0 ) -\n\t\t\t\t\t( doc && doc.clientTop || body && body.clientTop || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://code.google.com/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\n\n\t// Support: IE 10-11, Edge 10240+\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName( \"tbody\" )[ 0 ] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement( \"tbody\" ) ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tisFunction = jQuery.isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( isFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( isFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android<4.1, PhantomJS<2\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <= 35-45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <= 35-45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\n\t// Keep domManip exposed until 3.0 (gh-2225)\n\tdomManip: domManip,\n\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\n\n\nvar iframe,\n\telemdisplay = {\n\n\t\t// Support: Firefox\n\t\t// We have to pre-define these values for FF (#10227)\n\t\tHTML: \"block\",\n\t\tBODY: \"block\"\n\t};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\tdisplay = jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe || jQuery( \"