{"version":3,"sources":["public/js/kalamar-0.41.0-en.js"],"names":["requirejs","require","define","undef","main","req","makeMap","handlers","defined","waiting","config","defining","hasOwn","Object","prototype","hasOwnProperty","aps","slice","jsSuffixRegExp","hasProp","obj","prop","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","baseParts","split","map","starMap","length","nodeIdCompat","test","replace","charAt","concat","splice","join","makeRequire","relName","forceSync","args","arguments","push","apply","makeLoad","depName","value","callDep","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","KorAP","Event","halt","this","stopPropagation","preventDefault","_quoteRE","RegExp","String","quote","_escapeRE","escapeRegex","_slug1RE","_slug2RE","_removeChildren","node","firstChild","removeChild","_codeFromEvent","keyCode","charCode","_dec2hex","dec","toString","substr","slugify","toLowerCase","HTMLElement","toggleClass","c1","c2","cl","classList","contains","add","remove","addE","tag","appendChild","document","createElement","addT","text","createTextNode","API","Locale","loc","OR","AND","newStyleSheet","_sheet","sElem","head","sheet","log","type","msg","src","console","annotationHelper","-","ah","getDesc","foundryLayer","anno","includes","v","l1","l2","create","params","_init","upgradeTo","props","content","_content","action","_action","lcField","_lcField","active","bool","element","noMore","_el","li","onclick","bind","highlight","_prefix","lowlight","children","childNodes","_highlight","marks","getElementsByTagName","parentNode","replaceChild","nodeValue","elem","prefixString","nodeType","textlc","prefixes","trim","testPos","pos","len","forEach","insertBefore","hl","third","thirdE","t","_onclick","textContent","m","menu","hide","_menu","_string","_update","innerHTML","isSet","string","clear","chop","param","reset","_length","limit","_limit","_active","movetoRel","relativePos","relativeOffset","_rulerHeight","_sliderHeight","off","offset","parseInt","_screens","_event","initOffset","screen","movetoAbs","absPos","absOffset","_offset","_slider","style","top","_step","reInit","s","display","_height","height","el","setAttribute","_ruler","addEventListener","_mouseclick","_mousedown","_initClientHeight","clientHeight","_mousemove","clientY","init","_mouseup","removeEventListener","mov","up","focus","ev","getClientRects","defaultItemClass","defaultPrefixClass","defaultLengthFieldClass","sliderClass","list","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","item","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","blur","bounding","getBoundingClientRect","left","treeMenuClass","classes","title","data","cb","b","that","_bind","addList","addToggle","state","check","setState","associate","roll","buttonGroupClass","_bool","_add","parent","ldType","operation","newAfter","wrapOnRoot","wrap","DEL","_and","_or","_delete","delOperand","update","clean","and","or","del","op","cls","_del","_parent","operatorsClass","__changed","_ldType","_ops","refTo","_operands","group","append","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","span","rewriteText","rewrite","REGEX","REGEX_DESC","a","regexOp","regex","_regexOp","_regex","__regexOp","toggleRegex","val","_value","_input","store","r","re","_inField","rewriteListClass","stringValClass","EMPTY","refTitle","refE","_refE","ref","_changeRef","_rewrites","vc","dispatchEvent","CustomEvent","detail","_ref","_changed","strElem","replaceOperand","docGroupRefClass","errstr802","_obj","keyE","_keyE","_changeKey","key","k","matchopE","_matchopE","matchop","_changeMatchop","valueE","_valueE","_changeValue","replaceWith","_vcKeyMenu","typeOf","_validUnspecMatchRE","_validStringMatchRE","_validTextMatchRE","_validDateRE","_validDateMatchRE","errstr804","_key","released","doc","match","_type","_matchop","_vcMatchopMenu","mo","dp","_vcDatePicker","fromString","selected","input","docClass","newDoc","keyType","ellipsis","unspecClass","_validGroupOpRE","docGroupClass","operand","_duplicate","find","dupl","docGroup","operands","docGroupRef","getOperand","oldOp","newOp","reverse","opArray","brackets","filter","_name","release","prefixClass","_cb","found","statistic","_statistic","statDL","statSp","statDT","statDD","keys","Number","toLocaleString","WDAY","MONTH","d","_selected","select","year","month","day","_showYear","_showMonth","_showDay","set","_store","_click","dir","today","Date","getYear","getMonth","_monthHelper","_yearHelper","_dayHelper","_stringHelper","_updateYear","_updateMonth","_updateDay","getDate","incrYear","decrYear","incrMonth","decrMonth","_yElement","_selectYear","_mElement","_selectMonth","table","tr","_dBElement","_dayBody","showDate","date","click","setDate","getDay","tb","td","getFullYear","newBody","views","_classes","c","actions","prepend","_viewE","aElem","_viewElement","view","afterEmbed","delView","CLOSE","_shown","close","minimize","onClose","viewClass","statClass","buttonGroup","REFRESH","getvc","getStatistic","getCorpStat","statResponse","notif","_show","statTable","checkStatActive","newString","oldString","oldvcQuery","startsWith","disableStat","statt","getElementsByClassName","btg","reloadCorpStat","panelClass","corpStatVClass","SHOW_STAT","VERB_SHOWSTAT","addCorpStat","statView","unspecDocClass","dpClass","buttonGrClass","vcPanelClass","_validTextOnlyMatchRE","_overrideStyles","VC_allCorpora","VC_oneCollection","MINIMIZE","keyList","insertRule","l","unshift","_root","wasRewritten","builder","_builder","addVcInfPanel","isOpen","open","onOpen","onMinimize","getName","addRequired","vcClass","TOUR_Qexample","TOUR_vcQuery","TOUR_Relations","foundry","_foundry","layer","_layer","addTree","NEW_QUERY","esc","_getKeyValue","keyValue","_getAnnotation","target","orGroup","sort","innerText","matchTable","Node","_query","_matchTable","clickOnAnno","_queryFragment","toQueryBar","_ql","getElementById","_q","event","currentTarget","sib","annotation","tagName","previousSibling","toggleInToken","parentCell","nextSibling","from","keyvaluepair","_addToToken","term","token","arr","lastIndexOf","_removeFromToken","distance","ql","options","scrollTo","matchQueryCreator","_TermRE","snippet","html","_pos","_token","_mark","_markE","_cutted","_info","_parse","_matchCreator","toMark","scrollIntoView","inline","block","getToken","getValue","mark","newMark","hasAttribute","exec","getAttribute","$2","$1","$3","hasChildNodes","addCell","surface","tbody","cell","_AvailableRE","matchTableClass","infoLayerClass","_match","matchtable","getData","tokens","getTokens","getMatchInfo","spans","matchResponse","_table","_doc","NEW_CONSTRAINT","isEmpty","_frag","documents","vcFragmentClass","meta","_vc","_meta","Conf","clickOnMeta","_fragment","toVcBuilder","previousElementSibling","uriRE","mapRE","url","decodeURIComponent","payload","start","base64","isLink","contentType","atob","cbmClass","attClass","METADATA","fields","_fields","metaDL","posInMetaArray","metaL","dt","metaDescr","metaDD","att","field","md","_corpusByMatch","matchMetaClass","metaTable","getTextInfo","textResponse","global","self","dagre","o","u","code","1","graphlib","layout","debug","util","time","notime","version","./lib/debug","./lib/graphlib","./lib/layout","./lib/util","./lib/version","2","_","greedyFAS","run","g","fas","graph","acyclicer","edge","weight","weightFn","stack","visited","dfs","has","each","outEdges","w","nodes","dfsFAS","label","removeEdge","forwardName","reversed","setEdge","uniqueId","undo","edges","./greedy-fas","./lodash","3","addBorderNode","sg","sgNode","rank","width","curr","addDummyNode","setParent","borderLeft","borderRight","minRank","maxRank","./util","4","swapWidthHeight","swapWidthHeightOne","attrs","reverseYOne","y","swapXYOne","x","adjust","rankDir","rankdir","reverseY","swapXY","5","List","sentinel","_next","_prev","_sentinel","unlink","entry","filterOutLinks","dequeue","enqueue","strs","JSON","stringify","6","Graph","debugOrdering","layerMatrix","buildLayerMatrix","h","compound","multigraph","setGraph","setNode","layerV","reduce","./graphlib","7","8","nodeCount","fasGraph","maxIn","maxOut","in","out","prevWeight","edgeWeight","Math","max","buckets","range","zeroIdx","assignBucket","buildState","DEFAULT_WEIGHT_FN","results","sources","sinks","removeNode","doGreedyFAS","flatten","constant","collectPredecessors","inEdges","uEntry","wEntry","./data/list","9","acyclic","normalizeRanks","parentDummyChains","removeEmptyRanks","nestingGraph","addBorderSegments","coordinateSystem","order","opts","debugTiming","layoutGraph","inputGraph","canonicalize","merge","graphDefaults","selectNumberAttrs","graphNumAttrs","pick","graphAttrs","defaults","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","ranksep","minlen","labelpos","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","asNonCompoundGraph","injectEdgeLabelProxies","cleanup","borderTop","borderBottom","assignRankMinMax","dummy","labelRank","removeEdgeLabelProxies","layers","orderShift","selfEdge","insertSelfEdges","selfNode","dx","dy","positionSelfEdges","last","abs","removeBorderNodes","fixupEdgeLabelCoords","minX","POSITIVE_INFINITY","maxX","minY","maxY","graphLabel","marginX","marginx","marginY","marginy","getExtremes","min","translateGraph","p1","p2","nodeV","nodeW","intersectRect","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","edgesep","nodesep","mapValues","newAttrs","./acyclic","./add-border-segments","./coordinate-system","./nesting-graph","./normalize","./order","./parent-dummy-chains","./position","./rank","10","lodash","11","depths","depth","child","treeDepths","nodeSep","nestingRoot","acc","sumWeights","bottom","childNode","childTop","childBottom","thisWeight","nestingEdge","nodeRankFactor","12","dummyChains","vRank","wRank","edgeLabel","edgeObj","normalizeEdge","origLabel","successors","13","cg","vs","rootPrev","prevChild","../lodash","14","movable","inV","result","nodeU","sum","barycenter","15","relationship","hasNode","createRootNode","setDefaultNodeLabel","isUndefined","../graphlib","16","twoLayerCrossCount","northLayer","southLayer","southPos","zipObject","southEntries","chain","sortBy","firstIndex","treeSize","tree","cc","weightSum","layering","17","initOrder","crossCount","sortSubgraph","buildLayerGraph","addSubgraphConstraints","buildLayerGraphs","ranks","sweepLayerGraphs","layerGraphs","biasRight","lg","sorted","assignOrder","downLayerGraphs","upLayerGraphs","best","bestCC","lastBest","cloneDeep","../util","./add-subgraph-constraints","./build-layer-graph","./cross-count","./init-order","./sort-subgraph","18","simpleNodes","orderedVs","19","entries","mappedEntries","tmp","indegree","entryV","entryW","sourceSet","handleIn","vEntry","merged","source","mergeEntries","handleOut","pop","doResolveConflicts","20","resolveConflicts","bl","br","subgraphs","barycenters","subgraphResult","other","expandSubgraphs","predecessors","blPred","brPred","./barycenter","./resolve-conflicts","./sort","21","consumeUnsortable","unsortable","partition","sortable","lhs","rhs","vsIndex","bias","22","postorderNums","lim","low","postorder","pathData","lca","vPath","wPath","path","findPath","pathIdx","pathV","ascending","23","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","conflictsV","hasConflict","verticalAlignment","neighborFn","align","prevIdx","ws","mp","floor","il","ceil","horizontalCompaction","reverseSep","xs","blockG","blockGraph","sepFn","edgeSep","vLabel","wLabel","sep","vRoot","uRoot","prevMax","buildBlockGraph","pass1","pass2","findSmallestWidthAlignment","xss","alignCoordinates","alignTo","alignToMin","alignToMax","vert","horiz","alignment","balance","ul","ignore","pluck","positionX","adjustedLayering","values","inner","smallestWidth","24","rankSep","prevY","maxHeight","positionY","./bk","25","slack","tightTree","nodeEdges","edgeV","findMinSlackEdge","shiftRanks","directed","size","26","longestPath","feasibleTree","networkSimplex","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","./feasible-tree","./network-simplex","27","initRank","preorder","alg","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","isOutEdge","pointsToHead","otherWeight","hasEdge","isTreeEdge","otherCutValue","dfsAssignLowLim","nextLim","neighbors","tailLabel","flip","candidates","isDescendant","flipped","updateRanks","rootLabel","28","29","simplified","simpleLabel","isMultigraph","successorWeights","weightMap","sucs","predecessorWeights","preds","rect","point","sx","sy","collection","fn","now","30","31","lib","./lib","./lib/alg","./lib/json","32","cmpt","cmpts","33","isArray","doDfs","34","dijkstra","weightFunc","edgeFunc","transform","./dijkstra","35","PriorityQueue","edgeFn","pq","updateNeighbors","predecessor","decrease","removeMin","runDijkstra","DEFAULT_WEIGHT_FUNC","../data/priority-queue","36","tarjan","./tarjan","37","rowK","rowI","ik","kj","ij","altDistance","runFloydWarshall","38","components","dijkstraAll","findCycles","floydWarshall","isAcyclic","prim","topsort","./components","./dijkstra-all","./find-cycles","./floyd-warshall","./is-acyclic","./postorder","./preorder","./prim","./topsort","39","CycleException","40","./dfs","41","42","parents","pri","priority","../graph","43","onStack","lowlink","44","visit","45","_arr","_keyIndices","keyIndices","_decrease","_swap","_heapify","largest","origArrI","origArrJ","46","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","incrementOrInitEntry","decrementOrRemoveEntry","edgeArgsToId","isDirected","edgeArgsToObj","edgeObjToId","_nodeCount","_edgeCount","isCompound","newDefault","isFunction","setNodes","_removeFromParentsChildList","ancestor","predsV","sucsV","union","setDefaultEdgeLabel","edgeCount","setPath","valueSpecified","isPlainObject","freeze","outV","47","./graph","./version","48","writeNodes","writeEdges","edgeValue","write","clone","read","49","/Users/cpettitt/projects/dagre/lib/lodash.js","50","51","arrayPool","objectPool","idCounter","keyPrefix","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEsTemplate","reFlags","reFuncName","reInterpolate","reLeadingSpacesAndZeros","reNoMatch","reThis","reUnescapedString","contextProps","templateCounter","argsClass","arrayClass","boolClass","dateClass","objectClass","stringClass","cloneableClasses","[object Function]","debounceOptions","leading","maxWait","trailing","descriptor","configurable","enumerable","writable","objectTypes","boolean","function","object","number","stringEscapes","\\","'","\n","\r","\t"," "," ","freeExports","freeModule","moduleExports","freeGlobal","baseIndexOf","array","fromIndex","cacheIndexOf","cache","cachePush","typeCache","charAtCallback","charCodeAt","compareAscending","ac","criteria","bc","createCache","first","mid","getObject","escapeStringChar","getArray","false","null","true","releaseArray","releaseObject","end","runInContext","context","Boolean","Function","TypeError","arrayRef","objectProto","oldDash","reNative","clearTimeout","fnToString","getPrototypeOf","isNative","defineProperty","func","nativeCreate","nativeIsArray","nativeIsFinite","isFinite","nativeIsNaN","isNaN","nativeKeys","nativeMax","nativeMin","nativeParseInt","nativeRandom","random","ctorByClass","lodashWrapper","chainAll","__chain__","__wrapped__","support","baseBind","bindData","partialArgs","thisArg","bound","thisBinding","baseCreate","isObject","setBindData","baseClone","isDeep","stackA","stackB","className","ctor","isArr","initedStack","assign","forOwn","objValue","properties","baseCreateCallback","argCount","identity","__bindData__","funcNames","funcDecomp","accumulator","baseCreateWrapper","bitmask","partialRightArgs","arity","isBind","isBindKey","isCurry","isCurryBound","baseDifference","getIndexOf","isLarge","baseFlatten","isShallow","isStrict","isArguments","valIndex","valLength","resIndex","baseIsEqual","isWhere","otherClass","aWrapped","bWrapped","ctorA","constructor","ctorB","forIn","baseMerge","stackLength","baseRandom","baseUniq","isSorted","seen","computed","createAggregator","setter","createCallback","createWrapper","isPartial","isPartialRight","escapeHtmlChar","htmlEscapes","WinRTError","templateSettings","escape","evaluate","interpolate","variable","imports","noop","shimIsPlainObject","unescapeHtmlChar","htmlUnescapes","iterable","&","<",">","\"","invert","reEscapedHtml","reUnescapedHtml","guard","argsIndex","argsLength","ownIndex","ownProps","forOwnRight","functions","isNumber","valueOf","objProto","isString","countBy","every","forEachRight","groupBy","indexBy","Infinity","current","noaccum","reduceRight","shuffle","rand","some","where","sortedIndex","rest","high","uniq","zip","debounce","wait","maxTimeoutId","stamp","timeoutId","trailingCall","lastCalled","delayed","remaining","isCalled","maxDelayed","leadingCall","mixin","methodNames","isFunc","methodName","getTime","whitespace","radix","property","wrapperValueOf","after","at","bindAll","funcs","bindKey","compact","compose","curry","defer","delay","difference","forInRight","pairs","initial","intersection","caches","trustIndexOf","outer","invoke","memoize","resolver","memoized","omit","once","ran","partial","partialRight","pull","step","reject","tap","interceptor","throttle","times","toArray","proto","without","wrapper","xor","collect","drop","eachRight","extend","methods","tail","unique","unzip","findIndex","findKey","findLast","findLastIndex","findLastKey","isBoolean","isDate","isElement","isEqual","parseFloat","isNull","isRegExp","noConflict","floating","noMin","noMax","template","settings","isEvaluating","importsKeys","importsValues","reDelimiters","escapeValue","interpolateValue","esTemplateValue","evaluateValue","hasVariable","sourceURL","unescape","all","any","detect","findWhere","foldl","foldr","include","inject","sample","take","callbackable","VERSION","_graph","_addNode","class","_c","createElementNS","_addEdge","_clean","center","treeDiv","cWidth","getComputedStyle","treeWidth","scrollLeft","toBase64","svgWrapper","outerHTML","svg","btoa","encodeURIComponent","canvas","setAttributeNS","x1","y1","x2","y2","_line","tspan","LINEHEIGHT","downloadLink","_tokens","_arcs","_tokenElements","_y","_currentInFocus","maxArc","overlapDiff","arcDiff","anchorDiff","anchorStart","tokenSep","xPadding","yPadding","temp","targetMap","targetID","relation","srcStart","srcEnd","direction","addRel","xmlid","newtarget","addToken","_rect","navigator","userAgent","createRange","selectNode","detach","_tokenPoint","box","_drawAnchor","anchor","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","right","_drawArc","arc","startPos","endPos","startY","endY","startAnchor","endAnchor","middle","cHeight","controlY","arcE","middleY","_labelsElement","arcRef","inFocus","labelE","textNode","labelBox","getBBox","textWidth","textHeight","labelR","boxWidth","marker","arrow","rel","cif","_sortArcs","anchors","sortedArcs","anchorSig","_sortedArcs","lengthSort","_sortedAnchors","scrollValue","textAnchor","node_i","arcs","labels","inclusive","matchTreeHierarchyClass","matchTreeArcClass","DOWNLOAD","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","SHOWANNO","SHOW_META","ADDTREE","addMeta","addTable","TreeMenu","tm","_treeMenuList","Plugin","matchButtons","_metaView","_tableView","_menuList","treeLayers","getSpans","getRels","menuList","matchPanelClass","_matchTerms","_initialized","textSigle","matchID","available","_avail","rels","refLine","querySelector","toggle","_container","_mirror","reposition","mirror","container","mirrorValue","_split","_rightPos","insert","splittedText","selectionStart","selectionEnd","moveto","charpos","inputClientRect","inputStyle","bodyClientRect","mirrorStyle","getPropertyValue","paddingLeft","marginLeft","borderLeftWidth","borderLeftStyle","fontSize","fontFamily","_desc","hint","inputField","desc","lengthFieldClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","qfield","inputFieldElement","_analyzer","alert","charPos","contextMenu","ifContext","noC","_unshow","getContext","unshow","_hash","get","cookie","pair","parse","sessionClass","session","_session","removeAttribute","div","_iframe","_cutoff","useQuery","q","qc","_cuttoff","checked","QLmenu","selectValue","setPage","initQueries","querySelectorAll","initDocLinks","getPage","page","frames","location","pathname","search","nodeName","isTop","testDiv","scrollIntervalId","isBrowser","isPageLoaded","readyCalls","callReady","callbacks","runCallbacks","pageLoaded","clearInterval","attachEvent","frameElement","doScroll","external","setInterval","readyState","domReady","onLoad","isBuild","Alertify","$","btnCancel","btnOK","btnReset","btnResetBack","btnFocus","elCallee","elCover","elDialog","elLog","getTransitionEvent","_alertify","dialogs","isopen","queue","buttons","holder","submit","ok","cancel","message","supported","transitions","WebkitTransition","MozTransition","OTransition","transition","cssClass","dialog","confirm","buttonReverse","buttonFocus","addListeners","common","hasOK","hasCancel","hasInput","unbind","setFocus","handleErrors","onerror","line","error","appendButtons","secondary","primary","build","css","hideElement","transitionDone","timer","placeholder","activeElement","scrollTop","setup","notify","fromQueue","detachEvent","prompt","success","alertify","_index","showTitle","selectMenuItemClass","opt","_select","_title","showSelected","selectedIndex","vParam","qlf","hljs","attributes","cI","compiled","bK","lR","bR","eW","eR","tE","iR","starts","endsParent","E","classPrefix","L","sL","M","B","subLanguageMode","language","cN","rB","eB","rE","eE","N","R","C","I","S","languages","second_best","tabReplace","useBR","called","highlightAuto","fixMarkup","highlightBlock","configure","initHighlighting","initHighlightingOnLoad","registerLanguage","aliases","listLanguages","getLanguage","inherit","IR","UIR","NR","CNR","BNR","RSR","BE","ASM","QSM","PWM","CLCM","CBCM","HCM","NM","CNM","BNM","CSSNM","RM","TM","UTM","literal","kq","kqInner","koralQuery","kqViewClass","TOGGLE_ALIGN","SHOW_KQ","aRoll","opened","_opened","clearButtonGroup","addKqAction","kqButton","_kq","addAlignAction","olCl","nn","introJs","warn","IntroJs","_targetElement","_introItems","_options","nextLabel","prevLabel","skipLabel","doneLabel","hidePrev","hideNext","tooltipPosition","tooltipClass","highlightClass","exitOnEsc","exitOnOverlayClick","showStepNumbers","keyboardNavigation","showButtons","showBullets","showProgress","scrollToElement","scrollPadding","overlayOpacity","positionPrecedence","disableInteraction","helperElementPadding","hintPosition","hintButtonLabel","hintAnimation","buttonClass","_introForElement","targetElm","allIntroSteps","introItems","steps","_forEach","currentItem","_cloneObject","floatingElementQuery","currentElement","intro","nextStep","tempIntroItems","z","_addOverlayLayer","_nextStep","DOMEvent","on","_onKeyDown","_onResize","refresh","which","_previousStep","srcElement","_currentStep","_introCompleteCallback","_exitIntro","returnValue","_goToStep","_goToStepNumber","_currentStepNumber","_direction","continueStep","_introBeforeChangeCallback","_showElement","_refresh","_setHelperLayerPosition","oldHelperNumberLayer","oldArrowLayer","oldtooltipContainer","_placeTooltip","_reAlignHints","targetElement","force","continueExit","_introBeforeExitCallback","overlayLayers","overlayLayer","opacity","helperLayer","referenceLayer","disableInteractionLayer","floatingElement","_removeShowElement","_removeClass","_introExitCallback","tooltipLayer","arrowLayer","helperNumberLayer","hintMode","currentStepObj","tooltipOffset","targetOffset","windowSize","currentTooltipPosition","tooltipCssClass","marginTop","_determineAutoPosition","_getOffset","_getWinSize","_addClass","tooltipLayerStyleRight","_checkLeft","tooltipLayerStyleLeftRight","_checkRight","tooltipLayerStyleLeft","desiredTooltipPosition","possiblePositions","tooltipHeight","tooltipWidth","targetElementRect","calculatedPosition","_removeEntry","hyphenIndex","desiredAlignment","halfTooltipWidth","winWidth","possibleAlignments","calculatedAlignment","_determineAutoAlignment","stringArray","stringToRemove","elementPosition","widthHeightPadding","_isFixed","cssText","_disableInteraction","_setAnchorAsButton","tabIndex","_introChangeCallback","nextTooltipButton","prevTooltipButton","skipTooltipButton","scrollParent","oldHelperLayer","oldReferenceLayer","oldtooltipLayer","lastIntroItem","_getScrollParent","_scrollParentToElement","_lastShowElementTimer","_getProgress","_scrollTo","tooltipTextLayer","bulletsLayer","progressLayer","buttonsLayer","ulContainer","anchorClick","goToStep","innerLi","anchorLink","progressBar","_introSkipCallback","parentElm","SVGElement","currentElementPosition","_getPropValue","zIndex","_setShowElement","_introAfterChangeCallback","innerHeight","innerWidth","_elementInViewport","winHeight","scrollBy","elm","forEachFnc","completeFnc","_stamp","events_key","_id","listener","useCapture","handler","pre","classNameRegex","propName","propValue","currentStyle","defaultView","D","documentElement","clientWidth","styleText","_removeHintTooltip","tooltip","_populateHints","hints","_addHints","_alignHintPosition","_hintQuerySelectorAll","selector","hintsWrapper","_hideHint","stepId","_hintCloseCallback","_hideHints","_showHints","_showHint","_removeHints","_removeHint","evt","cancelBubble","_showHintDialog","getHintClick","hintDot","hintPulse","_hintsAddedCallback","hintElement","_hintClickCallback","removedStep","tooltipWrapper","closeButton","docEl","pageYOffset","pageXOffset","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","exit","onbeforechange","providedCallback","onchange","onafterchange","oncomplete","onhintsadded","onhintclick","onhintclose","onexit","onskip","onbeforeexit","addHints","hideHint","hideHints","showHint","showHints","removeHints","removeHint","showHintDialog","introClass","hintClass","TOUR_lskip","TOUR_lprev","TOUR_lnext","TOUR_ldone","TOUR_ldoneSearch","TOUR_welc","TOUR_sear1","TOUR_searAnnot","TOUR_annotAss","TOUR_vccho1","TOUR_vccho2","TOUR_vcStat1","TOUR_vcStat2","TOUR_qlfield","TOUR_help","TOUR_glimpse","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","labelOpts","usabilityOpts","doe","gTstartSearch","elparam","Steps","testPrerequ","targetedElement","vchoo","vcv","Hint","gTshowResults","tourR","StepsSR","tour","StepsT","gtour","stepCount","testIntros","allowed","scripts","presentation","forms","downloads-without-user-activation","downloads","_perm","Set","perm","_closeIframe","_load","protocol","sendMsg","contentWindow","postMessage","serviceClass","isWidget","resize","_mgr","_closeService","_assoc","associates","widgetClass","stateClass","Panel","services","plugins","buttonsSingle","query","limits","register","about","widgets","embed","onClick","icon","addService","permissions","service","onload","sendToggle","addWidget","_interpolateURI","_getServiceID","_listener","_receiveMsg","_timer","_randomID","widget","Pipe","job","URLSearchParams","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","URL","legacySigle","legacy","docFragment","getJSON","getCollections","cq","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","responseText","status","statusText","ontimeout","send","putJSON","deleteAtURL","getQueryList","getQuery","qn","putQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","tourshow","tourshowR","vcname","vcchoose","Notifications","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","Plugins"],"mappings":"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","sourcesContent":["(function () {\n/**\r\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\r\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\r\n */\r\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\r\n//be followed.\r\n/*global setTimeout: false */\r\n\r\nvar requirejs, require, define;\r\n(function (undef) {\r\n    var main, req, makeMap, handlers,\r\n        defined = {},\r\n        waiting = {},\r\n        config = {},\r\n        defining = {},\r\n        hasOwn = Object.prototype.hasOwnProperty,\r\n        aps = [].slice,\r\n        jsSuffixRegExp = /\\.js$/;\r\n\r\n    function hasProp(obj, prop) {\r\n        return hasOwn.call(obj, prop);\r\n    }\r\n\r\n    /**\r\n     * Given a relative module name, like ./something, normalize it to\r\n     * a real name that can be mapped to a path.\r\n     * @param {String} name the relative name\r\n     * @param {String} baseName a real name that the name arg is relative\r\n     * to.\r\n     * @returns {String} normalized name\r\n     */\r\n    function normalize(name, baseName) {\r\n        var nameParts, nameSegment, mapValue, foundMap, lastIndex,\r\n            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\r\n            baseParts = baseName && baseName.split(\"/\"),\r\n            map = config.map,\r\n            starMap = (map && map['*']) || {};\r\n\r\n        //Adjust any relative paths.\r\n        if (name) {\r\n            name = name.split('/');\r\n            lastIndex = name.length - 1;\r\n\r\n            // If wanting node ID compatibility, strip .js from end\r\n            // of IDs. Have to do this here, and not in nameToUrl\r\n            // because node allows either .js or non .js to map\r\n            // to same file.\r\n            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\r\n                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\r\n            }\r\n\r\n            // Starts with a '.' so need the baseName\r\n            if (name[0].charAt(0) === '.' && baseParts) {\r\n                //Convert baseName to array, and lop off the last part,\r\n                //so that . matches that 'directory' and not name of the baseName's\r\n                //module. For instance, baseName of 'one/two/three', maps to\r\n                //'one/two/three.js', but we want the directory, 'one/two' for\r\n                //this normalization.\r\n                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\r\n                name = normalizedBaseParts.concat(name);\r\n            }\r\n\r\n            //start trimDots\r\n            for (i = 0; i < name.length; i++) {\r\n                part = name[i];\r\n                if (part === '.') {\r\n                    name.splice(i, 1);\r\n                    i -= 1;\r\n                } else if (part === '..') {\r\n                    // If at the start, or previous value is still ..,\r\n                    // keep them so that when converted to a path it may\r\n                    // still work when converted to a path, even though\r\n                    // as an ID it is less than ideal. In larger point\r\n                    // releases, may be better to just kick out an error.\r\n                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\r\n                        continue;\r\n                    } else if (i > 0) {\r\n                        name.splice(i - 1, 2);\r\n                        i -= 2;\r\n                    }\r\n                }\r\n            }\r\n            //end trimDots\r\n\r\n            name = name.join('/');\r\n        }\r\n\r\n        //Apply map config if available.\r\n        if ((baseParts || starMap) && map) {\r\n            nameParts = name.split('/');\r\n\r\n            for (i = nameParts.length; i > 0; i -= 1) {\r\n                nameSegment = nameParts.slice(0, i).join(\"/\");\r\n\r\n                if (baseParts) {\r\n                    //Find the longest baseName segment match in the config.\r\n                    //So, do joins on the biggest to smallest lengths of baseParts.\r\n                    for (j = baseParts.length; j > 0; j -= 1) {\r\n                        mapValue = map[baseParts.slice(0, j).join('/')];\r\n\r\n                        //baseName segment has  config, find if it has one for\r\n                        //this name.\r\n                        if (mapValue) {\r\n                            mapValue = mapValue[nameSegment];\r\n                            if (mapValue) {\r\n                                //Match, update name to the new value.\r\n                                foundMap = mapValue;\r\n                                foundI = i;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (foundMap) {\r\n                    break;\r\n                }\r\n\r\n                //Check for a star map match, but just hold on to it,\r\n                //if there is a shorter segment match later in a matching\r\n                //config, then favor over this star map.\r\n                if (!foundStarMap && starMap && starMap[nameSegment]) {\r\n                    foundStarMap = starMap[nameSegment];\r\n                    starI = i;\r\n                }\r\n            }\r\n\r\n            if (!foundMap && foundStarMap) {\r\n                foundMap = foundStarMap;\r\n                foundI = starI;\r\n            }\r\n\r\n            if (foundMap) {\r\n                nameParts.splice(0, foundI, foundMap);\r\n                name = nameParts.join('/');\r\n            }\r\n        }\r\n\r\n        return name;\r\n    }\r\n\r\n    function makeRequire(relName, forceSync) {\r\n        return function () {\r\n            //A version of a require function that passes a moduleName\r\n            //value for items that may need to\r\n            //look up paths relative to the moduleName\r\n            var args = aps.call(arguments, 0);\r\n\r\n            //If first arg is not require('string'), and there is only\r\n            //one arg, it is the array form without a callback. Insert\r\n            //a null so that the following concat is correct.\r\n            if (typeof args[0] !== 'string' && args.length === 1) {\r\n                args.push(null);\r\n            }\r\n            return req.apply(undef, args.concat([relName, forceSync]));\r\n        };\r\n    }\r\n\r\n    function makeNormalize(relName) {\r\n        return function (name) {\r\n            return normalize(name, relName);\r\n        };\r\n    }\r\n\r\n    function makeLoad(depName) {\r\n        return function (value) {\r\n            defined[depName] = value;\r\n        };\r\n    }\r\n\r\n    function callDep(name) {\r\n        if (hasProp(waiting, name)) {\r\n            var args = waiting[name];\r\n            delete waiting[name];\r\n            defining[name] = true;\r\n            main.apply(undef, args);\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(defining, name)) {\r\n            throw new Error('No ' + name);\r\n        }\r\n        return defined[name];\r\n    }\r\n\r\n    //Turns a plugin!resource to [plugin, resource]\r\n    //with the plugin being undefined if the name\r\n    //did not have a plugin prefix.\r\n    function splitPrefix(name) {\r\n        var prefix,\r\n            index = name ? name.indexOf('!') : -1;\r\n        if (index > -1) {\r\n            prefix = name.substring(0, index);\r\n            name = name.substring(index + 1, name.length);\r\n        }\r\n        return [prefix, name];\r\n    }\r\n\r\n    //Creates a parts array for a relName where first part is plugin ID,\r\n    //second part is resource ID. Assumes relName has already been normalized.\r\n    function makeRelParts(relName) {\r\n        return relName ? splitPrefix(relName) : [];\r\n    }\r\n\r\n    /**\r\n     * Makes a name map, normalizing the name, and using a plugin\r\n     * for normalization if necessary. Grabs a ref to plugin\r\n     * too, as an optimization.\r\n     */\r\n    makeMap = function (name, relParts) {\r\n        var plugin,\r\n            parts = splitPrefix(name),\r\n            prefix = parts[0],\r\n            relResourceName = relParts[1];\r\n\r\n        name = parts[1];\r\n\r\n        if (prefix) {\r\n            prefix = normalize(prefix, relResourceName);\r\n            plugin = callDep(prefix);\r\n        }\r\n\r\n        //Normalize according\r\n        if (prefix) {\r\n            if (plugin && plugin.normalize) {\r\n                name = plugin.normalize(name, makeNormalize(relResourceName));\r\n            } else {\r\n                name = normalize(name, relResourceName);\r\n            }\r\n        } else {\r\n            name = normalize(name, relResourceName);\r\n            parts = splitPrefix(name);\r\n            prefix = parts[0];\r\n            name = parts[1];\r\n            if (prefix) {\r\n                plugin = callDep(prefix);\r\n            }\r\n        }\r\n\r\n        //Using ridiculous property names for space reasons\r\n        return {\r\n            f: prefix ? prefix + '!' + name : name, //fullName\r\n            n: name,\r\n            pr: prefix,\r\n            p: plugin\r\n        };\r\n    };\r\n\r\n    function makeConfig(name) {\r\n        return function () {\r\n            return (config && config.config && config.config[name]) || {};\r\n        };\r\n    }\r\n\r\n    handlers = {\r\n        require: function (name) {\r\n            return makeRequire(name);\r\n        },\r\n        exports: function (name) {\r\n            var e = defined[name];\r\n            if (typeof e !== 'undefined') {\r\n                return e;\r\n            } else {\r\n                return (defined[name] = {});\r\n            }\r\n        },\r\n        module: function (name) {\r\n            return {\r\n                id: name,\r\n                uri: '',\r\n                exports: defined[name],\r\n                config: makeConfig(name)\r\n            };\r\n        }\r\n    };\r\n\r\n    main = function (name, deps, callback, relName) {\r\n        var cjsModule, depName, ret, map, i, relParts,\r\n            args = [],\r\n            callbackType = typeof callback,\r\n            usingExports;\r\n\r\n        //Use name if no relName\r\n        relName = relName || name;\r\n        relParts = makeRelParts(relName);\r\n\r\n        //Call the callback to define the module, if necessary.\r\n        if (callbackType === 'undefined' || callbackType === 'function') {\r\n            //Pull out the defined dependencies and pass the ordered\r\n            //values to the callback.\r\n            //Default to [require, exports, module] if no deps\r\n            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\r\n            for (i = 0; i < deps.length; i += 1) {\r\n                map = makeMap(deps[i], relParts);\r\n                depName = map.f;\r\n\r\n                //Fast path CommonJS standard dependencies.\r\n                if (depName === \"require\") {\r\n                    args[i] = handlers.require(name);\r\n                } else if (depName === \"exports\") {\r\n                    //CommonJS module spec 1.1\r\n                    args[i] = handlers.exports(name);\r\n                    usingExports = true;\r\n                } else if (depName === \"module\") {\r\n                    //CommonJS module spec 1.1\r\n                    cjsModule = args[i] = handlers.module(name);\r\n                } else if (hasProp(defined, depName) ||\r\n                           hasProp(waiting, depName) ||\r\n                           hasProp(defining, depName)) {\r\n                    args[i] = callDep(depName);\r\n                } else if (map.p) {\r\n                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\r\n                    args[i] = defined[depName];\r\n                } else {\r\n                    throw new Error(name + ' missing ' + depName);\r\n                }\r\n            }\r\n\r\n            ret = callback ? callback.apply(defined[name], args) : undefined;\r\n\r\n            if (name) {\r\n                //If setting exports via \"module\" is in play,\r\n                //favor that over return value and exports. After that,\r\n                //favor a non-undefined return value over exports use.\r\n                if (cjsModule && cjsModule.exports !== undef &&\r\n                        cjsModule.exports !== defined[name]) {\r\n                    defined[name] = cjsModule.exports;\r\n                } else if (ret !== undef || !usingExports) {\r\n                    //Use the return value from the function.\r\n                    defined[name] = ret;\r\n                }\r\n            }\r\n        } else if (name) {\r\n            //May just be an object definition for the module. Only\r\n            //worry about defining if have a module name.\r\n            defined[name] = callback;\r\n        }\r\n    };\r\n\r\n    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\r\n        if (typeof deps === \"string\") {\r\n            if (handlers[deps]) {\r\n                //callback in this case is really relName\r\n                return handlers[deps](callback);\r\n            }\r\n            //Just return the module wanted. In this scenario, the\r\n            //deps arg is the module name, and second arg (if passed)\r\n            //is just the relName.\r\n            //Normalize module name, if it contains . or ..\r\n            return callDep(makeMap(deps, makeRelParts(callback)).f);\r\n        } else if (!deps.splice) {\r\n            //deps is a config object, not an array.\r\n            config = deps;\r\n            if (config.deps) {\r\n                req(config.deps, config.callback);\r\n            }\r\n            if (!callback) {\r\n                return;\r\n            }\r\n\r\n            if (callback.splice) {\r\n                //callback is an array, which means it is a dependency list.\r\n                //Adjust args if there are dependencies\r\n                deps = callback;\r\n                callback = relName;\r\n                relName = null;\r\n            } else {\r\n                deps = undef;\r\n            }\r\n        }\r\n\r\n        //Support require(['a'])\r\n        callback = callback || function () {};\r\n\r\n        //If relName is a function, it is an errback handler,\r\n        //so remove it.\r\n        if (typeof relName === 'function') {\r\n            relName = forceSync;\r\n            forceSync = alt;\r\n        }\r\n\r\n        //Simulate async callback;\r\n        if (forceSync) {\r\n            main(undef, deps, callback, relName);\r\n        } else {\r\n            //Using a non-zero value because of concern for what old browsers\r\n            //do, and latest browsers \"upgrade\" to 4 if lower value is used:\r\n            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\r\n            //If want a value immediately, use require('id') instead -- something\r\n            //that works in almond on the global level, but not guaranteed and\r\n            //unlikely to work in other AMD implementations.\r\n            setTimeout(function () {\r\n                main(undef, deps, callback, relName);\r\n            }, 4);\r\n        }\r\n\r\n        return req;\r\n    };\r\n\r\n    /**\r\n     * Just drops the config on the floor, but returns req in case\r\n     * the config return value is used.\r\n     */\r\n    req.config = function (cfg) {\r\n        return req(cfg);\r\n    };\r\n\r\n    /**\r\n     * Expose module registry for debugging and tooling\r\n     */\r\n    requirejs._defined = defined;\r\n\r\n    define = function (name, deps, callback) {\r\n        if (typeof name !== 'string') {\r\n            throw new Error('See almond README: incorrect module build, no module name');\r\n        }\r\n\r\n        //This module may not have dependencies\r\n        if (!deps.splice) {\r\n            //deps is not an array, so probably means\r\n            //an object literal or factory function for\r\n            //the value. Adjust args.\r\n            callback = deps;\r\n            deps = [];\r\n        }\r\n\r\n        if (!hasProp(defined, name) && !hasProp(waiting, name)) {\r\n            waiting[name] = [name, deps, callback];\r\n        }\r\n    };\r\n\r\n    define.amd = {\r\n        jQuery: true\r\n    };\r\n}());\r\n\ndefine(\"lib/almond\", function(){});\n\n\r\n\r\nwindow.KorAP = window.KorAP || {};\r\n\r\n// Don't let events bubble up\r\nif (Event.halt === undefined) {\r\n  // Don't let events bubble up\r\n  Event.prototype.halt = function () {\r\n    this.stopPropagation();\r\n    this.preventDefault();\r\n  };\r\n};\r\n\r\nconst _quoteRE = new RegExp(\"([\\\"\\\\\\\\])\", 'g');\r\nString.prototype.quote = function () {\r\n  return '\"' + this.replace(_quoteRE, '\\\\$1') + '\"';\r\n};\r\n\r\nconst _escapeRE = new RegExp(\"([\\/\\\\\\\\])\", 'g');\r\nString.prototype.escapeRegex = function () {\r\n  return this.replace(_escapeRE, '\\\\$1');\r\n};\r\n\r\nconst _slug1RE = new RegExp(\"[^-a-zA-Z0-9_\\\\s]+\", 'g');\r\nconst _slug2RE = new RegExp(\"[-\\\\s]+\", 'g');\r\nString.prototype.slugify = function () {\r\n  return this.toLowerCase().replace(_slug1RE, '').replace(_slug2RE, '-');\r\n};\r\n\r\n// Add toggleClass method similar to jquery\r\nHTMLElement.prototype.toggleClass = function (c1, c2) {\r\n  const cl = this.classList;\r\n  if (cl.contains(c1)) {\r\n    cl.add(c2);\r\n    cl.remove(c1);\r\n  }\r\n  else {\r\n    cl.remove(c2);\r\n    cl.add(c1);\r\n  };\r\n};\r\n\r\n// Append element by tag name\r\nHTMLElement.prototype.addE = function (tag) {\r\n  return this.appendChild(document.createElement(tag));\r\n};\r\n\r\n// Append text node\r\nHTMLElement.prototype.addT = function (text) {\r\n  return this.appendChild(document.createTextNode(text));\r\n};\r\n\r\n\r\n// Utility for removing all children of a node\r\nfunction _removeChildren (node) {\r\n  // Remove everything underneath\r\n  while (node.firstChild)\r\n    node.removeChild(node.firstChild);\r\n};\r\n\r\n\r\n// Utility to get either the charCode\r\n// or the keyCode of an event\r\nfunction _codeFromEvent (e) {\r\n  if ((e.charCode) && (e.keyCode==0))\r\n    return e.charCode\r\n  return e.keyCode;\r\n};\r\n\r\nfunction _dec2hex (dec) {\r\n  return ('0' + dec.toString(16)).substr(-2)\r\n};\r\n\r\n\r\n/**\r\n * Create random identifiers\r\n */\r\n/*\r\n * code based on\r\n * https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript#8084248\r\n */\r\nfunction randomID (len) {\r\n  const arr = new Uint8Array((len || 40) / 2)\r\n  window.crypto.getRandomValues(arr)\r\n  return Array.from(arr, _dec2hex).join('')\r\n};\r\n\r\n\r\ndefine('util',[],function () {\r\n  // Todo: That's double now!\r\n  KorAP.API = KorAP.API || {};\r\n  KorAP.Locale = KorAP.Locale || {};\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.OR  = loc.OR  || 'or';\r\n  loc.AND = loc.AND || 'and';\r\n\r\n  // Add new stylesheet object lazily to document\r\n  KorAP.newStyleSheet = function () {\r\n    if (KorAP._sheet === undefined) {\r\n      const sElem = document.createElement('style');\r\n      document.head.appendChild(sElem);\r\n      KorAP._sheet = sElem.sheet;\r\n    };\r\n    return KorAP._sheet;\r\n  };\r\n\r\n\r\n  // Default log message\r\n  KorAP.log = KorAP.log || function (type, msg, src) {\r\n    if (src)\r\n      msg += ' from ' + src;\r\n    console.log(type + \": \" + msg);\r\n  };\r\n\r\n  return KorAP;\r\n});\r\n\nKorAP.annotationHelper = KorAP.annotationHelper || { '-' : [] };\r\n\r\n\r\n\r\ndefine('hint/foundries',[\"util\"], function () {\r\n\r\n  const ah = KorAP.annotationHelper;\r\n\r\n  ah.getDesc = function (foundryLayer, value) {\r\n\r\n    if (!foundryLayer)\r\n      return;\r\n\r\n    let anno = this[foundryLayer];\r\n\r\n    if (!anno)\r\n      return;\r\n\r\n    if (!value.includes(':')) {\r\n      value += ' ';\r\n\r\n      // Iterate over all annotations and add the descriptions\r\n      // This is a classic hash-lookup-case, but we have\r\n      // to deal with lists ...\r\n      for (var i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == value) {\r\n          if (anno[i][2])\r\n            return anno[i][2];\r\n          else\r\n            return;\r\n        };\r\n      };\r\n\r\n      return;\r\n    }\r\n\r\n    else {\r\n      const v = value.split(\":\");\r\n      let l1 = v[0] + ':';\r\n      let l2 = v[1] + ' ';\r\n      let text = '';\r\n\r\n      // Add key description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l1) {\r\n          if (anno[i][2])\r\n            text += anno[i][2];\r\n          else\r\n            text += anno[i][0];\r\n          break;\r\n        };\r\n      };\r\n\r\n      // Nothing found\r\n      if (text.length === 0)\r\n        return;\r\n\r\n      // Check next level\r\n      anno = this[foundryLayer + l1];\r\n\r\n      if (!anno)\r\n        return;\r\n\r\n      // Add value description\r\n      for (let i = 0; i < anno.length; i++) {\r\n        if (anno[i] &&\r\n            anno[i][1] == l2) {\r\n          if (anno[i][2])\r\n            text += ': ' + anno[i][2];\r\n\r\n          return text;\r\n        };\r\n      };      \r\n    };\r\n\r\n    return '';\r\n  };\r\n\r\n  return ah;\r\n});\r\n\ndefine('hint/foundries/base',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"Base Annotation\", \"base/s=\", \"Structure\"]\r\n  );\r\n\r\n  ah[\"base/s=\"] = [\r\n    [\"s\", \"s\", \"Sentence\"],\r\n    [\"p\", \"p\", \"Paragraph\"],\r\n    [\"t\", \"t\", \"Text\"]\r\n  ];\r\n});\r\n\ndefine('hint/foundries/dereko',[\"hint/foundries\"], function (ah) {\r\n  ah[\"-\"].push(\r\n    [\"DeReKo\", \"dereko/s=\", \"Structure\"]\r\n  );\r\n});\r\n\nrequire([\r\n  \"hint/foundries/base\",\r\n  \"hint/foundries/dereko\"\r\n]);\r\n\ndefine(\"default\", function(){});\n\n/*\r\n * MenuItems may define:\r\n *\r\n * onclick: action happen on click and enter.\r\n * further: action happen on right arrow\r\n */\r\n\r\n\r\n\r\n/**\r\n * Item in the Dropdown menu\r\n */\r\ndefine('menu/item',{\r\n  /**\r\n   * Create a new MenuItem object.\r\n   *\r\n   * @constructor\r\n   * @this {MenuItem}\r\n   * @param {Array.<string>} An array object of name, action and\r\n   *   optionally a description\r\n   */\r\n  create : function (params) {\r\n    return Object.create(this)._init(params);\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object] An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the content of the meun item.\r\n   */\r\n  content : function (content) {\r\n    if (arguments.length === 1)\r\n      this._content = document.createTextNode(content);\r\n    return this._content;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the information for action of this item. \r\n   */\r\n  action : function (action) {\r\n    if (arguments.length === 1)\r\n      this._action = action;\r\n    return this._action;\r\n  },\r\n  \r\n\r\n  /**\r\n   * Get the lower cased field of the item\r\n   * (used for analyses).\r\n   */\r\n  lcField : function () {\r\n    return this._lcField;\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is active\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check or set if the item is\r\n   * at the boundary of the menu\r\n   * list\r\n   *\r\n   * @param {boolean|null} State of activity\r\n   */\r\n  noMore : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"no-more\");\r\n    else if (bool)\r\n      cl.add(\"no-more\");\r\n    else\r\n      cl.remove(\"no-more\");\r\n  },\r\n  \r\n  /**\r\n   * Get the document element of the menu item\r\n   */\r\n  element : function () {\r\n    // already defined\r\n    if (this._el !== undefined)\r\n      return this._el;\r\n    \r\n    // Create list item\r\n    const li = document.createElement(\"li\");\r\n\r\n    // Connect action\r\n    if (this[\"onclick\"] !== undefined) {\r\n      li[\"onclick\"] = this.onclick.bind(this);\r\n    };\r\n\r\n    // Append template\r\n    li.appendChild(this.content());\r\n    \r\n    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Highlight parts of the item\r\n   *\r\n   * @param {string} Prefix string for highlights\r\n   */\r\n  highlight : function (prefix) {\r\n\r\n    // The prefix already matches\r\n    if (this._prefix === prefix)\r\n      return;\r\n\r\n    // There is a prefix but it doesn't match\r\n    if (this._prefix !== null) {\r\n      this.lowlight();\r\n    }\r\n\r\n    const children = this.element().childNodes;\r\n    for (let i = children.length -1; i >= 0; i--) {\r\n      this._highlight(children[i], prefix);\r\n    };\r\n\r\n    this._prefix = prefix;\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove highlight of the menu item\r\n   */\r\n  lowlight : function () {\r\n    if (this._prefix === null)\r\n      return;\r\n\r\n    const e = this.element();\r\n    \r\n    const marks = e.getElementsByTagName(\"mark\");\r\n\r\n    for (let i = marks.length - 1; i >= 0; i--) {\r\n\r\n      // Replace with content\r\n      marks[i].parentNode.replaceChild(\r\n        // Create text node clone\r\n\t      document.createTextNode(\r\n\t        marks[i].firstChild.nodeValue\r\n        ),\r\n\t      marks[i]\r\n      );\r\n    };\r\n\r\n    // Remove consecutive textnodes\r\n    e.normalize();\r\n    this._prefix = null;\r\n  },\r\n\r\n\r\n  // Highlight a certain substring of the menu item\r\n  _highlight : function (elem, prefixString) {    \r\n    if (elem.nodeType === 3) {\r\n      \r\n      const text   = elem.nodeValue;\r\n      const textlc = text.toLowerCase();\r\n\r\n      // Split prefixes\r\n      if (prefixString) {\r\n\r\n        // ND:\r\n        //   Doing this in a single line can trigger\r\n        //   a deep-recursion in Firefox 57.01, though I don't know why.\r\n        prefixString = prefixString.trim();\r\n\r\n        const prefixes = prefixString.split(\" \");\r\n\r\n        let testPos,\r\n            pos = -1,\r\n            len = 0;\r\n\r\n        // Iterate over all prefixes and get the best one\r\n        // for (var i = 0; i < prefixes.length; i++) {\r\n        prefixes.forEach(function(i) {\r\n\r\n          // Get first pos of a matching prefix\r\n          testPos = textlc.indexOf(i);\r\n          if (testPos < 0)\r\n            return;\r\n\r\n          if (pos === -1 || testPos < pos) {\r\n            pos = testPos;\r\n            len = i.length;\r\n          }\r\n          else if (testPos === pos && i.length > len) {\r\n            len = i.length;\r\n          };\r\n        });\r\n\r\n        // Matches!\r\n        if (pos >= 0) {\r\n\t\r\n\t        // First element\r\n\t        if (pos > 0) {\r\n\t          elem.parentNode.insertBefore(\r\n\t            document.createTextNode(text.substr(0, pos)),\r\n\t            elem\r\n\t          );\r\n\t        };\r\n\t\r\n\t        // Second element\r\n\t        const hl = document.createElement(\"mark\");\r\n\t        hl.appendChild(\r\n\t          document.createTextNode(text.substr(pos, len))\r\n\t        );\r\n\t        elem.parentNode.insertBefore(hl, elem);\r\n\t\r\n\t        // Third element\r\n\t        const third = text.substr(pos + len);\r\n\r\n\t        if (third.length > 0) {\r\n\t          const thirdE = document.createTextNode(third);\r\n\t          elem.parentNode.insertBefore(\r\n\t            thirdE,\r\n\t            elem\r\n\t          );\r\n\t          this._highlight(thirdE, prefixString);\r\n\t        };\r\n\t\r\n          elem.parentNode.removeChild(elem);\r\n        };\r\n      };\r\n    }\r\n\r\n    else {\r\n      const children = elem.childNodes;\r\n      for (let i = children.length -1; i >= 0; i--) {\r\n\t      this._highlight(children[i], prefixString);\r\n      };\r\n    };\r\n  },\r\n\r\n  // Initialize menu item\r\n  _init : function (params) {\r\n    \r\n    if (params[0] === undefined) {\r\n      throw new Error(\"Missing parameters\");\r\n    };\r\n\r\n    const t = this;\r\n\r\n    t.content(params[0]);\r\n    \r\n    if (params.length > 1) {\r\n      t._action = params[1];\r\n\r\n      if (params.length > 2)\r\n        t._onclick = params[2];\r\n    };\r\n    \r\n    t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n    t._prefix = null;\r\n\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * The click action of the menu item.\r\n   */\r\n  onclick : function (e) {\r\n    const m = this.menu();\r\n\r\n    // Reset prefix\r\n    m.prefix(\"\");\r\n\r\n    if (this._onclick)\r\n      this._onclick.apply(this, e);\r\n\r\n    m.hide();\r\n  },\r\n\r\n  \r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/prefix',{\r\n\r\n  /**\r\n   * Create new prefix object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function () {\r\n    const t = this;\r\n\r\n    t._string = '';\r\n\r\n    // Add prefix span\r\n    t._el = document.createElement('span');\r\n    t._el.classList.add('pref');\r\n    // Connect action\r\n\r\n    if (t[\"onclick\"] !== undefined)\r\n      t._el[\"onclick\"] = t.onclick.bind(t);\r\n    \r\n    return t;\r\n  },\r\n\r\n\r\n  _update : function () {\r\n    return this._el.innerHTML\r\n      = this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the activity status of the prefix.\r\n   */\r\n  active : function (bool) {\r\n    const cl = this.element().classList;\r\n    if (bool === undefined)\r\n      return cl.contains(\"active\");\r\n    else if (bool)\r\n      cl.add(\"active\");\r\n    else\r\n      cl.remove(\"active\");\r\n  },\r\n\r\n\r\n  /**\r\n   * Check, if a prefix is given or not.\r\n   */\r\n  isSet : function () {\r\n    return this._string.length > 0 ?\r\n      true : false;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get or set the prefix string.\r\n   */\r\n  value : function (string) {\r\n    if (arguments.length === 1) {\r\n      this._string = string;\r\n      return this._update();\r\n    };\r\n    return this._string;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to prefix.\r\n   */\r\n  add : function (string) {\r\n    this._string += string;\r\n    return this._update();\r\n  },\r\n  \r\n\r\n  /**\r\n   * Clear prefix\r\n   */\r\n  clear : function () {\r\n    this._string = '';\r\n    return this._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Action method.\r\n   * Expected to be overridden.\r\n   */\r\n  onclick : function () {},\r\n\r\n  \r\n  /**\r\n   * Remove the last character of the string\r\n   */\r\n  chop : function () {\r\n    const t = this;\r\n\r\n    // Prefix is long enough for backspace\r\n    if (t._string.length > 1) {\r\n      t._string = t._string.substring(\r\n\t      0, t._string.length - 1\r\n      );\r\n    }\r\n    else {\r\n      t._string = '';\r\n    };\r\n    \r\n    return t._update();\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Return menu list.\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n});\r\n\n\r\n\r\ndefine('menu/lengthField',{\r\n\r\n  /**\r\n   * Create new lengthField object.\r\n   */\r\n  create : function () {\r\n    return Object.create(this)._init();\r\n  },\r\n\r\n\r\n  // Initialize lengthField object\r\n  _init : function () {\r\n    this._el = document.createElement('div');\r\n    this._el.classList.add('lengthField');\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Upgrade this object to another object,\r\n   * while private data stays intact.\r\n   *\r\n   * @param {Object} An object with properties.\r\n   */\r\n  upgradeTo : function (props) {\r\n    for (let prop in props) {\r\n      this[prop] = props[prop];\r\n    };\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Add string to lengthField.\r\n   */\r\n  add : function (param) {\r\n    this._el.appendChild(document.createElement('span'))\r\n      .appendChild(document.createTextNode(param[0] + '--'));\r\n  },\r\n\r\n\r\n  /**\r\n   * Remove all initialized values\r\n   */\r\n  reset : function () {\r\n    while (this._el.firstChild) {\r\n      this._el.firstChild.remove();\r\n    };\r\n  }\r\n});\r\n\n\r\n\r\n/**\r\n * Create slider for menus.\r\n * The slider will only be used by mouse - touch support\r\n * shouldn't be necessary, as the menu can be scrolled using touch.\r\n *\r\n * @author Nils Diewald\r\n */\r\ndefine('menu/slider',{\r\n\r\n  /**\r\n   * Create new slider for Menu.\r\n   * @this {Slider}\r\n   * @constructor\r\n   * @param {Menu} menu object\r\n   */\r\n  create : function (menu) {\r\n    return Object.create(this)._init(menu);\r\n  },\r\n\r\n\r\n  /**\r\n   * Length attribute of the slider\r\n   * (as number of items).\r\n   *\r\n   * @param {number} Number of items (optional)\r\n   */\r\n  length : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._length;\r\n    if (i == this._length)\r\n      return this;\r\n    this._length = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Limit of items per screen.\r\n   *\r\n   * @param {number} Number of items per screen (optional)\r\n   */\r\n  limit : function (i) {\r\n    if (arguments.length === 0)\r\n      return this._limit;\r\n    if (i == this._limit)\r\n      return this;\r\n    this._limit = i;\r\n    return this;\r\n  },\r\n\r\n\r\n  /**\r\n   * Is the slider active or not.\r\n   *\r\n   * @param {bool} true or false (optional)\r\n   */\r\n  active : function (bool) {\r\n    if (arguments.length === 1) {\r\n      if (bool) {\r\n\t      if (!this._active) {\r\n\t        this._el.classList.add('active');\r\n\t        this._active = true;\r\n\t      };\r\n      }\r\n      else if (this._active) {\r\n\t      this._el.classList.remove('active');\r\n\t      this._active = false;\r\n      }\r\n    };\r\n    return this._active;\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to a relative position\r\n   *\r\n   * @param {number} relative position\r\n   */\r\n  movetoRel : function (relativePos) {\r\n\r\n    // This is important to find the correct percentage!\r\n    const diffHeight = (this._rulerHeight - this._sliderHeight);\r\n    const relativeOffset = (relativePos / diffHeight);\r\n\r\n    // Offset is a value 0 to this._screens\r\n    const off = this.offset(\r\n      parseInt(relativeOffset * this._screens) + this._event.initOffset\r\n    );\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Move the slider to an absolute position\r\n   *\r\n   * @param {number} absolute position\r\n   */\r\n  movetoAbs : function (absPos) {\r\n    const absOffset = (absPos / this._rulerHeight);\r\n    const off = this.offset(parseInt(absOffset * (this._screens + 1)));\r\n\r\n    if (off !== undefined) {\r\n      this._menu.screen(off);\r\n    };\r\n  },\r\n\r\n\r\n  /**\r\n   * Screen offset of the slider\r\n   *\r\n   * @param {number} Offset position of the slider (optional)\r\n   */\r\n  offset : function (off) {\r\n    if (arguments.length === 0)\r\n      return this._offset;\r\n\r\n    // Normalize offset\r\n    if (off > this._screens)\r\n      off = this._screens;\r\n    else if (off < 0)\r\n      off = 0;\r\n\r\n    // Identical with old value\r\n    if (off === this._offset)\r\n      return undefined;\r\n\r\n    // Set offset and move\r\n    this._offset = off;\r\n    this._slider.style.top = (this._step * off) + '%';\r\n    return off;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get the associated dom element.\r\n   */\r\n  element : function () {\r\n    return this._el;\r\n  },\r\n\r\n\r\n  /**\r\n   * Reinitialize the size of the slider.\r\n   * Necessary to call after each adjustment of the list.\r\n   */\r\n  reInit : function () {\r\n\r\n    const t = this;\r\n    const s = t._el.style;\r\n\r\n    // Do not show the slider, in case there is nothing to scroll\r\n    if (t._length <= t._limit) {\r\n      s.display = 'none';\r\n      return;\r\n    }\r\n    else {\r\n      s.display = 'block';\r\n    };\r\n\r\n    t._height  = ((t._limit / t._length) * 100);\r\n    t._screens = t._length - t._limit;\r\n    t._step    = (100 - t._height) / t._screens;\r\n    t._slider.style.height = t._height + '%';\r\n  },\r\n\r\n\r\n  // Initialize prefix object\r\n  _init : function (menu) {\r\n    const t = this;\r\n\r\n    t._menu = menu;\r\n\r\n    t._offset = 0;\r\n    t._event = {};\r\n    t._active = false;\r\n\r\n    const el = t._el = document.createElement('div');\r\n    el.setAttribute('class', 'ruler');\r\n\r\n    t._slider = el.appendChild(\r\n      document.createElement('span')\r\n    );\r\n\r\n    t._ruler = el.appendChild(document.createElement('div'));\r\n\r\n    // Do not mark the menu on mousedown\r\n    t._ruler.addEventListener('mousedown', function (e) {\r\n      e.halt()\r\n    }, false);\r\n\r\n    // Move the slider to the click position\r\n    t._ruler.addEventListener('click', t._mouseclick.bind(t), false);\r\n\r\n    t._slider.addEventListener('mousedown', t._mousedown.bind(t), false);\r\n\r\n    return t;\r\n  },\r\n\r\n\r\n  // Reinit height based on dom position\r\n  _initClientHeight : function () {\r\n    this._rulerHeight  = this._el.clientHeight;\r\n    this._sliderHeight = this._slider.clientHeight;\r\n  },\r\n\r\n\r\n  // Release mousemove event\r\n  _mousemove : function (e) {\r\n    this.movetoRel(e.clientY - this._event.init);\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release mouseup event\r\n  _mouseup : function (e) {\r\n    this.active(false);\r\n    window.removeEventListener('mousemove', this._event.mov);\r\n    window.removeEventListener('mouseup', this._event.up);\r\n    this._menu.focus();\r\n  },\r\n\r\n\r\n  // Release mousedown event\r\n  _mousedown : function (e) {\r\n    // Bind drag handler\r\n    const ev = this._event;\r\n\r\n    // _step * _offset is the distance of the ruler to the top\r\n    ev.init = e.clientY;\r\n    ev.initOffset = this._offset;\r\n    // By substracting that, it is like initializing to the first point\r\n\r\n    ev.mov  = this._mousemove.bind(this);\r\n    ev.up   = this._mouseup.bind(this);\r\n\r\n    // TODO: This may not be necessary all the time\r\n    this._initClientHeight();\r\n\r\n    this.active(true);\r\n\r\n    window.addEventListener('mousemove', ev.mov);\r\n    window.addEventListener('mouseup', ev.up);\r\n\r\n    e.halt();\r\n  },\r\n\r\n\r\n  // Release event to reposition slider on ruler\r\n  _mouseclick : function (e) {\r\n    this._initClientHeight();\r\n\r\n    this.movetoAbs(\r\n      e.clientY - this._ruler.getClientRects()[0].top\r\n    );\r\n    e.halt();\r\n  }\r\n});\r\n\n/**\r\n * Scrollable drop-down menus with view filter.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Show the slider briefly on move (whenever screen is called).\r\n * TODO: Ignore alt+ and strg+ key strokes.\r\n * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live\r\n * TODO: Add a \"title\" to a menu that is not scrollable.\r\n * TODO: Make the menu responsive by showing less items on smaller screens\r\n *       or anytime items would be outside the screen.\r\n * TODO: Add a .match() method to items for scrolling and probably for prefixing.\r\n * TODO: Add static header (for title, sortation fields, but also for menu points like \"fragments\" and \"history\".\r\n * TODO: Support space separated list of prefixes so \"co no\" will highlight \"common noun\"\r\n */\r\n\r\n\r\ndefine('menu',[\r\n  'menu/item',\r\n  'menu/prefix',\r\n  'menu/lengthField',\r\n  'menu/slider',\r\n  'util'\r\n], function (defaultItemClass,\r\n             defaultPrefixClass,\r\n             defaultLengthFieldClass,\r\n             sliderClass) {\r\n\r\n  // Default maximum number of menu items\r\n  const menuLimit = 8;\r\n\r\n  /**\r\n   * List of items for drop down menu (complete).\r\n   * Only a sublist of the menu is filtered (live).\r\n   * Only a sublist of the filtered menu is visible (shown).\r\n   */\r\n  return {\r\n    /**\r\n     * Create new Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} Context prefix\r\n     * @param {Array.<Array.<string>>} List of menu items\r\n     */\r\n    create : function (list, params) {\r\n      return Object.create(this)._init(list, params);\r\n    },\r\n\r\n    // Initialize list\r\n    _init : function (list, params) {\r\n      \r\n      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n\r\n      t._itemClass = params[\"itemClass\"] || defaultItemClass;\r\n\r\n      // Add prefix object\r\n      if (params[\"prefixClass\"] !== undefined) {\r\n        t._prefix = params[\"prefixClass\"].create();\r\n      }\r\n      else {\r\n        t._prefix = defaultPrefixClass.create();\r\n      };\r\n      t._prefix._menu = t;\r\n\r\n      // Add lengthField object\r\n      if (params[\"lengthFieldClass\"] !== undefined) {\r\n        t._lengthField = params[\"lengthFieldClass\"].create();\r\n      }\r\n      else {\r\n        t._lengthField = defaultLengthFieldClass.create();\r\n      };\r\n      t._lengthField._menu = t;\r\n\r\n      // Initialize slider\r\n      t._slider = sliderClass.create(t);\r\n\r\n      // Create the element\r\n      var el = document.createElement(\"ul\");\r\n      el.style.outline = 0;\r\n      el.setAttribute('tabindex', 0);\r\n      el.classList.add('menu', 'roll');\r\n      el.appendChild(t._prefix.element());\r\n      el.appendChild(t._lengthField.element());\r\n      el.appendChild(t._slider.element());\r\n\r\n      // This has to be cleaned up later on\r\n      el[\"menu\"] = t;\r\n\r\n      // Arrow keys\r\n      el.addEventListener(\r\n        'keydown',\r\n        t._keydown.bind(t),\r\n        false\r\n      );\r\n\r\n      // Strings\r\n      el.addEventListener(\r\n        'keypress',\r\n        t._keypress.bind(t),\r\n        false\r\n      );\r\n\r\n      // Mousewheel\r\n      el.addEventListener(\r\n        'wheel',\r\n        t._mousewheel.bind(t),\r\n        false\r\n      );\r\n\r\n      // Touch events\r\n      ['touchstart', 'touchend', 'touchmove'].forEach(\r\n        e => el.addEventListener(e, t._touch.bind(t), false)\r\n      );\r\n\r\n      \r\n      t._el = el;\r\n\r\n      t._limit = menuLimit;\r\n      \r\n      t._items = new Array();\r\n\r\n      // TODO:\r\n      // Make this separate from _init\r\n      t.readItems(list);\r\n\r\n      t.dontHide = false;\r\n        \r\n      return t;\r\n    },\r\n\r\n    // Read items to add to list\r\n    readItems : function (list) {\r\n      const t = this;\r\n\r\n      t._list = undefined;\r\n\r\n      // Remove circular reference to \"this\" in items\r\n      for (let i = 0; i < t._items.length; i++) {\r\n        delete t._items[i][\"_menu\"];\r\n        delete t._items[i];\r\n      };\r\n\r\n      t._items = new Array();\r\n      t.removeItems();\r\n\r\n\r\n      // Initialize items\r\n      t._lengthField.reset();\r\n\r\n      // Initialize item list based on parameters\r\n      list.forEach(function(i){\r\n        const obj = this._itemClass.create(i);\r\n\r\n        // This may become circular\r\n        obj[\"_menu\"] = this;\r\n        this._lengthField.add(i);\r\n        this._items.push(obj);\r\n      }, t);\r\n\r\n      t._slider.length(t.liveLength())\r\n        .limit(t._limit)\r\n        .reInit();\r\n      \r\n      t._firstActive = false;\r\n      // Show the first item active always?\r\n      t.offset = 0;\r\n      t.position = 0;\r\n    },\r\n    \r\n    // Initialize the item list\r\n    _initList : function () {\r\n      const t = this;\r\n\r\n      // Create a new list\r\n      if (t._list === undefined) {\r\n        t._list = [];\r\n      }\r\n      else if (t._list.length !== 0) {\r\n        t._boundary(false);\r\n        t._list.length = 0;\r\n      };\r\n\r\n      // Offset is initially zero\r\n      t.offset = 0;\r\n\r\n      // There is no prefix set\r\n      if (t.prefix().length <= 0) {\r\n\r\n        // add all items to the list and lowlight\r\n        let i = 0;\r\n        for (; i < t._items.length; i++) {\r\n          t._list.push(i);\r\n          t._items[i].lowlight();\r\n        };\r\n\r\n        t._slider.length(i).reInit();\r\n\r\n        return true;\r\n      };\r\n\r\n      /*\r\n       * There is a prefix set, so filter the list!\r\n       */\r\n      let pos;\r\n      const prefixList = t.prefix().toLowerCase().split(\" \");\r\n\r\n      const items = [];\r\n      let maxPoints = 1; // minimum 1\r\n\r\n      // Iterate over all items and choose preferred matching items\r\n      // i.e. the matching happens at the word start\r\n      t._items.forEach(function(it, pos){\r\n\r\n        let points = 0;\r\n\r\n        prefixList.forEach(function(p) {\r\n\r\n          // Check if it matches at the beginning\r\n          if ((it.lcField().includes(\" \" + p))) {\r\n            points += 5;\r\n          }\r\n\r\n          // Check if it matches anywhere\r\n          else if (it.lcField().includes(p)) {\r\n            points += 1;\r\n          };\r\n        });\r\n\r\n        if (points > maxPoints) {\r\n          this._list = [pos];\r\n          maxPoints = points;\r\n        }\r\n        else if (points == maxPoints) {\r\n          this._list.push(pos);\r\n        }\r\n      }, t);\r\n\r\n      t._slider.length(t._list.length).reInit();\r\n\r\n      // Filter was successful - yeah!\r\n      return t._list.length > 0 ? true : false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Destroy this menu\r\n     * (in case you don't trust the\r\n     * mark and sweep GC)!\r\n     */\r\n    destroy : function () {\r\n      const t = this;\r\n\r\n      // Remove circular reference to \"this\" in menu\r\n      if (t._el != undefined)\r\n        delete t._el[\"menu\"]; \r\n\r\n      // Remove circular reference to \"this\" in items\r\n      t._items.forEach(function(i) {\r\n        delete i[\"_menu\"];\r\n      });\r\n\r\n      // Remove circular reference to \"this\" in prefix\r\n      delete t._prefix['_menu'];\r\n      delete t._lengthField['_menu'];\r\n      delete t._slider['_menu'];\r\n    },\r\n\r\n\r\n    /**\r\n     * Focus on this menu.\r\n     */\r\n    focus : function () {\r\n      this._el.focus();\r\n    },\r\n\r\n\r\n    // mouse wheel treatment\r\n    _mousewheel : function (e) {\r\n      const delta = e.deltaY / 120;\r\n      if (delta > 0)\r\n        this.next();\r\n      else if (delta < 0)\r\n        this.prev();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    // touchmove treatment\r\n    _touch : function (e) {\r\n      const s = this.slider();\r\n\r\n      if (e.type === \"touchstart\") {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n      else if (e.type === \"touchend\") {\r\n        this._lastTouch = undefined;\r\n      }\r\n      else if (e.type === \"touchmove\") {\r\n        const to = e.touches[0];\r\n\r\n        // TODO:\r\n        // Instead of using 26px, choose the item height\r\n        // or use the menu height // shownItems\r\n        \r\n        // s.movetoRel(t.clientY - this._initTouch);\r\n        if ((this._lastTouch + 26) < to.clientY) {\r\n          this.viewDown();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        else if ((this._lastTouch - 26) > to.clientY) {\r\n          this.viewUp();\r\n          this._lastTouch = to.clientY;\r\n        }\r\n        e.halt();\r\n      };\r\n    },\r\n\r\n    // Arrow key and prefix treatment\r\n    _keydown : function (e) {\r\n      const t = this;\r\n\r\n      switch (_codeFromEvent(e)) {\r\n\r\n      case 27: // 'Esc'\r\n        e.halt();\r\n        t.hide();\r\n        break;\r\n\r\n      case 38: // 'Up'\r\n        e.halt();\r\n        t.prev();\r\n        break;\r\n\r\n      case 33: // 'Page up'\r\n        e.halt();\r\n        t.pageUp();\r\n        break;\r\n\r\n      case 40: // 'Down'\r\n        e.halt();\r\n        t.next();\r\n        break;\r\n\r\n      case 34: // 'Page down'\r\n        e.halt();\r\n        t.pageDown();\r\n        break;\r\n\r\n      case 39: // 'Right'\r\n        if (t._prefix.active())\r\n          break;\r\n\r\n        const item = t.liveItem(t.position);\r\n        \r\n        if (item[\"further\"] !== undefined) {\r\n          item[\"further\"].bind(item).apply();\r\n        };\r\n        \r\n        e.halt();\r\n        break;\r\n\r\n      case 13: // 'Enter'\r\n        // Click on prefix\r\n        if (t._prefix.active())\r\n          t._prefix.onclick(e);\r\n\r\n        // Click on item\r\n        else\r\n          t.liveItem(t.position).onclick(e);\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t._prefix.chop();\r\n        t.show();\r\n        e.halt();\r\n        break;\r\n      };\r\n    },\r\n\r\n\r\n    // Add characters to prefix\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix\r\n        this._prefix.add(\r\n          String.fromCharCode(_codeFromEvent(e))\r\n        );\r\n\r\n        this.show();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Show a screen with a given offset\r\n     * in the viewport.\r\n     */\r\n    screen : function (nr) {\r\n      const t = this;\r\n\r\n      // Normalize negative values\r\n      if (nr < 0) {\r\n        nr = 0\r\n      }\r\n\r\n      // The shown list already shows everything\r\n      else if (t.liveLength() < t.limit()) {\r\n        return false;\r\n      }\r\n\r\n      // Move relatively to the next screen\r\n      else if (nr > (t.liveLength() - t.limit())) {\r\n        nr = (t.liveLength() - t.limit());\r\n      };\r\n\r\n      // no change\r\n      if (t.offset === nr)\r\n        return false;\r\n\r\n      t._showItems(nr);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the creator class for items\r\n     */\r\n    itemClass : function () {\r\n      return this._itemClass;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get and set the numerical value\r\n     * for the maximum number of items visible.\r\n     */\r\n    limit : function (limit) {\r\n      if (arguments.length === 1) {\r\n        if (this._limit !== limit) {\r\n          this._limit = limit;\r\n          this._slider.limit(limit).reInit();\r\n        };\r\n        return this;\r\n      };\r\n      return this._limit;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Filter the list and make it visible.\r\n     * This is always called once the prefix changes.\r\n     *\r\n     * @param {string} Prefix for filtering the list\r\n     */\r\n    show : function (active) {\r\n      const t = this;\r\n\r\n      // show menu based on initial offset\r\n      t._unmark();     // Unmark everything that was marked before\r\n      t.removeItems();\r\n\r\n      // Initialize the list\r\n      if (!t._initList()) {\r\n\r\n        // The prefix is not active\r\n        t._prefix.active(true);\r\n\r\n        // finally show the element\r\n        t._el.classList.add('visible');\r\n        \r\n        return true;\r\n      };\r\n\r\n      let offset = 0;\r\n\r\n      // Set a chosen value to active and move the viewport\r\n      if (arguments.length === 1) {\r\n\r\n        // Normalize active value\r\n        if (active < 0) {\r\n          active = 0;\r\n        }\r\n        else if (active >= t.liveLength()) {\r\n          active = t.liveLength() - 1;\r\n        };\r\n\r\n        // Item is outside the first viewport\r\n        if (active >= t._limit) {\r\n          offset = active;\r\n          const newOffset = t.liveLength() - t._limit;\r\n          if (offset > newOffset) {\r\n            offset = newOffset;\r\n          };\r\n        };\r\n        \r\n        t.position = active;\r\n      }\r\n\r\n      // Choose the first item\r\n      else if (t._firstActive) {\r\n        t.position = 0;\r\n      }\r\n\r\n      // Choose no item\r\n      else {\r\n        t.position = -1;\r\n      };\r\n\r\n      t.offset = offset;\r\n      t._showItems(offset); // Show new item list\r\n\r\n      // Make chosen value active\r\n      if (t.position !== -1) {\r\n        t.liveItem(t.position).active(true);\r\n      };\r\n\r\n      // The prefix is not active\r\n      t._prefix.active(false);\r\n\r\n      // finally show the element\r\n      t._el.classList.add('visible');\r\n\r\n      // Add classes for rolling menus\r\n      t._boundary(true);\r\n\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide the menu and call the onHide callback.\r\n     */\r\n    hide : function () {\r\n      if (!this.dontHide) {\r\n        this.removeItems();\r\n        this._prefix.clear();\r\n        this.onHide();\r\n        this._el.classList.remove('visible');\r\n      }\r\n      // this._el.blur();\r\n    },\r\n\r\n\r\n    /**\r\n     * Function released when the menu hides.\r\n     * This method is expected to be overridden.\r\n     */\r\n    onHide : function () {},\r\n\r\n\r\n    /**\r\n     * Get the prefix for filtering,\r\n     * e.g. &quot;ve&quot; for &quot;verb&quot;\r\n     */\r\n    prefix : function (pref) {\r\n      if (arguments.length === 1) {\r\n        this._prefix.value(pref);\r\n        return this;\r\n      };\r\n      return this._prefix.value();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get the lengthField object.\r\n     */\r\n    lengthField : function () {\r\n      return this._lengthField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated slider object.\r\n     */\r\n    slider : function () {\r\n      return this._slider;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete all visible items from the menu element\r\n     */\r\n    removeItems : function () {\r\n      // Remove all children\r\n      const children = this._el.childNodes;\r\n\r\n      // Leave the prefix and lengthField\r\n      for (let i = children.length - 1; i >= 3; i--) {\r\n        this._el.removeChild(\r\n          children[i]\r\n        );\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (t.position !== -1 && !t._prefix.active()) {\r\n        t.liveItem(t.position).active(false);\r\n      };\r\n\r\n      // Get new active item\r\n      t.position++;\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The next element is undefined - roll to top or to prefix\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = this._prefix;\r\n\r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position--;\r\n          prefix.active(true);\r\n          return;\r\n        }\r\n\r\n        // Choose first item\r\n        else {\r\n          newItem = t.liveItem(0);\r\n          // choose first item\r\n          t.position = 0;\r\n          t._showItems(0);\r\n        };\r\n      }\r\n\r\n      // The next element is after the viewport - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 1);\r\n      }\r\n\r\n      // The next element is before the viewport - roll up\r\n      else if (t.position <= t.offset) {\r\n        t.screen(t.position);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /*\r\n     * Make the previous item in the menu active\r\n     */\r\n    prev : function () {\r\n      const t = this;\r\n\r\n      // No list\r\n      if (t.liveLength() === 0)\r\n        return;\r\n\r\n      // Deactivate old item\r\n      if (!t._prefix.active()) {\r\n\r\n        // No active element set\r\n        if (t.position === -1) {\r\n          t.position = t.liveLength();\r\n        }\r\n\r\n        // No active element set\r\n        else {\r\n          t.liveItem(t.position--).active(false);\r\n        };\r\n      };\r\n\r\n      // Get new active item\r\n      let newItem = t.liveItem(t.position);\r\n\r\n      // The previous element is undefined - roll to bottom\r\n      if (newItem === undefined) {\r\n\r\n        // Activate prefix\r\n        const prefix = t._prefix;\r\n        let offset =  t.liveLength() - t.limit();\r\n        \r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n\r\n        // Choose the last item\r\n        t.position = t.liveLength() - 1;\r\n        \r\n        // Prefix is set and not active - choose!\r\n        if (prefix.isSet() && !prefix.active()) {\r\n          t.position++;\r\n          prefix.active(true);\r\n          t.offset = offset;\r\n          return;\r\n        }\r\n\r\n        // Choose last item\r\n        else {\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\r\n        };\r\n      }\r\n\r\n      // The previous element is before the view - roll up\r\n      else if (t.position < t.offset) {\r\n        t.screen(t.position);\r\n      }\r\n\r\n      // The previous element is after the view - roll down\r\n      else if (t.position >= (t.limit() + t.offset)) {\r\n        t.screen(t.position - t.limit() + 2);\r\n      };\r\n\r\n      t._prefix.active(false);\r\n      newItem.active(true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page up by limit!\r\n     */\r\n    pageUp : function () {\r\n      this.screen(this.offset - this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the page down by limit!\r\n     */\r\n    pageDown : function () {\r\n      this.screen(this.offset + this.limit());\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item up\r\n     */\r\n    viewUp : function () {\r\n      this.screen(this.offset - 1);\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the view one item down\r\n     */\r\n    viewDown : function () {\r\n      this.screen(this.offset + 1);\r\n    },\r\n\r\n\r\n    // Unmark all items\r\n    _unmark : function () {\r\n      this._list.forEach(function(it){\r\n        const item = this._items[it];\r\n        item.lowlight();\r\n        item.active(false);\r\n      }, this);\r\n    },\r\n\r\n\r\n    // Set boundary for viewport\r\n    _boundary : function (bool) {\r\n      if (this._list.length === 0)\r\n        return;\r\n\r\n      this.item(this._list[0]).noMore(bool);\r\n      this.item(this._list[this._list.length - 1]).noMore(bool);\r\n    },\r\n\r\n\r\n    // Append Items that should be shown\r\n    _showItems : function (off) {\r\n      const t = this;\r\n\r\n      // optimization: scroll down one step\r\n      if (t.offset === (off - 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the first item\r\n        // leave lengthField/prefix/slider\r\n        t._el.removeChild(t._el.children[3]);\r\n\r\n        t._append(\r\n          t._list[t.offset + t.limit() - 1]\r\n        );\r\n      }\r\n\r\n      // optimization: scroll up one step\r\n      else if (t.offset === (off + 1)) {\r\n        t.offset = off;\r\n\r\n        // Remove the HTML node from the last item\r\n        t._el.removeChild(t._el.lastChild);\r\n\r\n        t._prepend(t._list[t.offset]);\r\n      }\r\n\r\n      else {\r\n        t.offset = off;\r\n\r\n        // Remove all items\r\n        t.removeItems();\r\n\r\n        // Use list\r\n        let shown = 0;\r\n\r\n        for (let i = 0; i < t._list.length; i++) {\r\n\r\n          // Don't show - it's before offset\r\n          shown++;\r\n          if (shown <= off)\r\n            continue;\r\n\r\n          t._append(t._list[i]);\r\n          \r\n          if (shown >= (t.limit() + off))\r\n            break;\r\n        };\r\n      };\r\n\r\n      // set the slider to the new offset\r\n      t._slider.offset(t.offset);\r\n    },\r\n\r\n\r\n    // Append item to the shown list based on index\r\n    _append : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      // Append element\r\n      this.element().appendChild(item.element());\r\n    },\r\n\r\n\r\n    // Prepend item to the shown list based on index\r\n    _prepend : function (i) {\r\n      const item = this.item(i);\r\n\r\n      // Highlight based on prefix\r\n      if (this.prefix().length > 0) {\r\n        item.highlight(this.prefix().toLowerCase());\r\n      };\r\n\r\n      const e = this.element();\r\n\r\n      // Append element after lengthField/prefix/slider\r\n      e.insertBefore(\r\n        item.element(),\r\n        e.children[3]\r\n      );\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu to choose from in a button group.\r\n */\r\n\r\n\r\ndefine('buttongroup/menu',['menu'], function (menuClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu object.\r\n     * Pass the panel object\r\n     * and the item parameters.\r\n     *\r\n     * @param panel The panel object\r\n     * @param params The match menu items\r\n     *   as an array of arrays.\r\n     */\r\n    create : function (list, itemClass) {\r\n      const obj = Object.create(menuClass)\r\n\t          .upgradeTo(this)\r\n\t          ._init(list, {itemClass : itemClass});\r\n      obj.limit(6);\r\n\r\n      const e = obj.element();\r\n\r\n      // This is only domspecific\r\n      e.addEventListener('blur', function (e) {\r\n\t      this.menu.hide();\r\n      });\r\n\r\n      e.classList.add('button-group-list');\r\n\r\n      // Add menu to body\r\n      document.getElementsByTagName('body')[0].appendChild(e);\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * The panel object of the menu.\r\n     */\r\n    panel :function (panelVar) {\r\n      if (panelVar !== undefined)\r\n        this._panel = panelVar;\r\n\r\n      return this._panel;\r\n    },\r\n\r\n\r\n    // Attach menu to button\r\n    button : function (btn) {\r\n\r\n      this._button = btn;\r\n\r\n      this._repos(this._button);\r\n      this.slider().reInit();\r\n\r\n      /*\r\n       * This is a suboptimal scrolling solution, see\r\n       * see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects\r\n       */\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n\r\n      this._onscroll = function () {\r\n        this._repos(this._button);\r\n      }.bind(this);\r\n      \r\n      window.addEventListener('scroll', this._onscroll);\r\n    },\r\n\r\n    \r\n    // Overwrite onHide method\r\n    onHide : function () {\r\n\r\n      // Remove listener\r\n      if (this._onscroll !== undefined) {\r\n        window.removeEventListener('scroll', this._onscroll);\r\n      };\r\n      this.element().blur();\r\n    },\r\n\r\n    _repos : function (e) {\r\n      const bounding = e.getBoundingClientRect();\r\n      this._el.style.left = bounding.left + \"px\";\r\n      this._el.style.top = (\r\n        bounding.top +\r\n          bounding.height -\r\n          this._el.clientHeight\r\n      ) + \"px\";\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('buttongroup',['buttongroup/menu','menu/item','util'], function (treeMenuClass, defaultItemClass) {\r\n  \r\n  return {\r\n    /**\r\n     * Create button group\r\n     */\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n    \r\n    // Initialize button group\r\n    _init : function (classes) {\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      if (classes) {\r\n        cl.add.apply(cl,classes);\r\n      };\r\n      cl.add('button-group');\r\n      this._el = e;\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Upgrade this object to another object, \r\n     * while private data stays intact.\r\n     * \r\n     * @param {Object} An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (var prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button in order\r\n     * \r\n     * Returns the button element\r\n     */\r\n    add : function (title, data, cb) {\r\n      \r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data !== undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(b.classList, data['cls']);\r\n        };\r\n     \r\n        if (data['icon'] !== undefined) { \r\n          b.setAttribute('data-icon', data['icon']);\r\n        };\r\n\r\n        if (data['state'] !== undefined) {\r\n          b['state'] = data['state'];\r\n        }\r\n      };\r\n     \r\n      b.addE('span').addT(title);\r\n\r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj, e)\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add button that spawns a list in order.\r\n     * \r\n     * Returns the list object.\r\n     */\r\n    addList : function (title, data, itemClass = defaultItemClass) {\r\n      const list = treeMenuClass.create([], itemClass);\r\n      this.add(title, data, function (e) {\r\n        list.show();\r\n        list.button(this.button);\r\n        list.focus();\r\n      });\r\n      return list;\r\n    },\r\n\r\n    /**\r\n     * Add button that can toggle a state.\r\n     * The state has to be a state object.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._el.addE('span');\r\n      b.setAttribute('title',title);\r\n\r\n      if (data != undefined) {\r\n        if (data['cls'] !== undefined) {\r\n          b.classList.add.apply(\r\n            b.classList,\r\n            data['cls']\r\n          );\r\n        };\r\n      };\r\n\r\n      // Set check marker\r\n      const check = b.addE('span');\r\n      check.classList.add(\"check\", \"button-icon\");\r\n      check.addE('span');\r\n\r\n      // Associate this object to state\r\n      // Add setState method to object\r\n      check.setState = function (value) {\r\n        if (value) {\r\n          this.classList.add(\"checked\");\r\n        } else {\r\n          this.classList.remove(\"checked\");\r\n        }\r\n      };\r\n      state.associate(check);\r\n\r\n      b.addE('span').addT(title);\r\n      \r\n      let that = this;\r\n      b.addEventListener('click', function (e) {\r\n\r\n        // Do not bubble\r\n        e.halt();\r\n        \r\n        // Toggle state\r\n        state.roll();\r\n      });\r\n\r\n      return b;\r\n    },\r\n\r\n    /**\r\n     * Bind an object to all callbacks of the button group. \r\n     * To get the button element inside the callback, \r\n     * use this.button\r\n     */\r\n    bind : function (obj) {\r\n      if (obj !== undefined) {\r\n        this._bind = obj;\r\n        return this;\r\n      };\r\n      return this._bind || this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove all defined buttons\r\n     */\r\n    clear : function () {\r\n      _removeChildren(this._el);\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Operators for criteria\r\n */\r\n\r\n\r\ndefine('vc/operators',['buttongroup'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.DEL   = loc.DEL   || '×';\r\n\r\n  // Utility for analysing boolean values\r\n  function _bool (bool) {\r\n    return (\r\n      bool === undefined ||\r\n        bool === null ||\r\n        bool === false) ? false : true;\r\n  };\r\n\r\n\r\n  // Add new unspecified document\r\n  function _add (obj, type) {\r\n    const parent = obj.parent();\r\n\r\n    if (obj.ldType() === 'docGroup') {\r\n\r\n      // Check that the action differs from the type\r\n      if (obj.operation() === type)\r\n\t      return;\r\n\r\n      if (parent.ldType() !== null) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      // The group is on root - wrap\r\n\t      return obj.wrapOnRoot();\r\n      };\r\n    }\r\n\r\n    else if (obj.ldType() === 'doc' ||\r\n             obj.ldType() === 'docGroupRef') {\r\n\r\n      if (parent.ldType() === null) {\r\n\t      return obj.wrapOnRoot(type);\r\n      }\r\n\r\n      else if (parent.operation() === type) {\r\n\t      return parent.newAfter(obj);\r\n      }\r\n\r\n      else {\r\n\t      return obj.wrap(type);\r\n      };\r\n    };\r\n  };\r\n\r\n\r\n  // Add doc with 'and' relation\r\n  KorAP._and = function () {\r\n    return _add(this, 'and');\r\n  };\r\n\r\n\r\n  // Add doc with 'or' relation\r\n  KorAP._or = function () {\r\n    return _add(this, 'or');\r\n  };\r\n\r\n\r\n  // Remove doc or docGroup\r\n  KorAP._delete = function () {\r\n    if (this.parent().ldType() !== null) {\r\n      return this.parent().delOperand(this).update();\r\n    }\r\n    else {\r\n      this.parent().clean();\r\n    };\r\n  };\r\n\r\n\r\n  return {\r\n    create : function (and, or, del) {\r\n      \r\n      // Inherit from buttonGroupClass\r\n      var op = Object(buttonGroupClass).create(['operators']).upgradeTo(this);\r\n      op.and(and);\r\n      op.or(or);\r\n      op.del(del);\r\n      op.update();\r\n\r\n      return op;\r\n    },\r\n\r\n\r\n    /*\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // Clear button group\r\n      t.clear();\r\n\r\n      if (t._and === true) {\r\n        t.add(loc.AND, {'cls':['and']}, KorAP._and);\r\n      };\r\n\r\n      // Add or button\r\n      if (t._or === true) {\r\n        t.add(loc.OR, {'cls':['or']}, KorAP._or);\r\n      };\r\n\r\n      // Add delete button\r\n      if (t._del === true) {\r\n        t.add(loc.DEL, {'cls':['delete']}, KorAP._delete);\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    // This is somehow redundant with bind, but relevant for ldTypes\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\r\n        // This is somehow duplicate - but it's not that relevant\r\n        this.bind(obj);\r\n      };\r\n\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    and : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._and = _bool(bool);\r\n      return this._and;\r\n    },\r\n\r\n\r\n    or : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._or = _bool(bool);\r\n      return this._or;\r\n    },\r\n\r\n\r\n    del : function (bool) {\r\n      if (arguments.length === 1)\r\n\t      this._del = _bool(bool);\r\n      return this._del;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Abstract JsonLD criterion object\r\n */\r\n\r\n\r\ndefine('vc/jsonld',['vc/operators'], function (operatorsClass) {\r\n\r\n  return {\r\n\r\n    __changed : false,\r\n    \r\n    create : function () {\r\n      return Object.create(this);\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object\r\n     * while private data stays intact\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n\t      this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    },\r\n    \r\n\r\n    ldType : function (type) {\r\n      if (arguments.length === 1)\r\n\t      this._ldType = type;\r\n      return this._ldType;\r\n    },\r\n    \r\n\r\n    parent : function (obj) {\r\n      if (arguments.length === 1) {\r\n\t      this._parent = obj;\r\n\t      this.__changed = true;\r\n      };\r\n      return this._parent;\r\n    },\r\n\r\n\r\n    // Destroy object - especially for\r\n    // acyclic structures!\r\n    // I'm paranoid!\r\n    destroy : function () {\r\n      const t = this;\r\n      if (t._ops != undefined) {\r\n\t      t._ops._parent = undefined;\r\n\t      if (t._ops._el !== undefined) {\r\n\t        t._ops._el.refTo = undefined;\r\n        };\r\n\t      t._ops = undefined;\r\n      };\r\n\r\n      if (t._el !== undefined)\r\n\t      t._el = undefined;\r\n      \r\n      // In case of a group, destroy all operands\r\n      if (t._operands !== undefined) {\r\n        t._operands.forEach(i => i.destroy());\r\n\t      t._operands = [];\r\n      };\r\n    },\r\n    \r\n    // Wrap a new operation around the root group element \r\n    wrapOnRoot : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n\r\n      if (arguments.length === 1)\r\n\t      group.operation(op);\r\n      else\r\n\t      group.operation(\r\n\t        this.operation() === 'and' ? 'or' : 'and'\r\n\t      );\r\n      group.append(this);\r\n      this.parent(group);\r\n      group.append();\r\n      group.element(); // Init (seems to be necessary)\r\n      parent.root(group);\r\n      return this.parent();\r\n    },\r\n\r\n\r\n    // Be aware! This may be cyclic\r\n    operators : function (and, or, del) {\r\n      if (arguments === 0)\r\n\t      return this._ops;\r\n\r\n      this._ops = operatorsClass.create(\r\n\t      and, or, del\r\n      );\r\n\r\n      this._ops.parent(this);\r\n      return this._ops;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      return {\r\n\t      // Unspecified object\r\n\t      \"@type\" : \"koral:\" + this.ldType()\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return null;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return false;\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      return '';\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Implementation of rewrite objects.\r\n */\r\n\r\n\r\ndefine('vc/rewrite',['vc/jsonld', 'util'], function (jsonldClass) {\r\n\r\n  // injection, modification, and deletion should probably be enough\r\n  const _validRewriteOpRE =\r\n        new RegExp(\"^(operation:)?(?:injec|inser|modifica|dele)tion|override$\");\r\n\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    // Get or set source\r\n    src : function (string) {\r\n      if (arguments.length === 1)\r\n\t      this._src = string;\r\n      return this._src;\r\n    },\r\n    \r\n\r\n    // Get or set operation\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validRewriteOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(814, \"Unknown rewrite operation\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'injection';\r\n    },\r\n\r\n\r\n    // Get or set scope\r\n    scope : function (attr) {\r\n      if (arguments.length === 1)\r\n\t      this._scope = attr;\r\n      return this._scope;\r\n    },\r\n\r\n\r\n    // Serialize from Json\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n\t      return this;\r\n      \r\n      // Missing @type\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n      \r\n      // Missing source\r\n      if (json[\"src\"] === undefined ||\r\n\t        typeof json[\"src\"] !== 'string') {\r\n\t      KorAP.log(815, \"Rewrite expects source\");\r\n\t      return;\r\n      };\r\n\r\n      // Set source\r\n      this.src(json[\"src\"]);\r\n\r\n      // Set operation\r\n      if (json[\"operation\"] !== undefined) {\r\n\t      this.operation(json[\"operation\"].replace(/^operation:/,''));\r\n      };\r\n\r\n      // Set scope\r\n      if (json[\"scope\"] !== undefined &&\r\n\t        typeof json[\"scope\"] === 'string')\r\n\t      this.scope(json[\"scope\"]);\r\n\r\n      return this;\r\n    },\r\n    \r\n\r\n    toString : function () {\r\n      let str = '';\r\n      const op = this.operation();\r\n      str += op.charAt(0).toUpperCase() + op.slice(1);\r\n      str += ' of ' + (\r\n\t      this._scope === null ?\r\n\t        'object' :\r\n\t        this.scope().quote()\r\n      );\r\n      str += ' by ' + this.src().quote();\r\n      return str;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/rewritelist',['vc/jsonld', 'vc/rewrite','util'], function (jsonldClass, rewriteClass) {\r\n  return {\r\n\r\n    // Construction method\r\n    create : function (json) {\r\n      return Object(jsonldClass).\r\n\t      create().\r\n\t      upgradeTo(this).\r\n\t      fromJson(json);\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from KoralQuery\r\n     */\r\n    fromJson : function (json) {\r\n      this._list = new Array();\r\n      json.forEach(\r\n        i => \r\n\t        this._list.push(\r\n\t          rewriteClass.create(i)\r\n\t        )\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    length : function () {\r\n      return this._list.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'rewrite');\r\n\r\n      const comments = [];\r\n      let span, rewriteText;\r\n      this._list.forEach(function (rewrite) {\r\n\t    \r\n        // This is a blind element\r\n\t      span = document.createElement('span');\r\n\r\n\t      // Set class attribute\r\n\t      span.setAttribute('class', rewrite.operation());\r\n\r\n\t      // Append source information\r\n\t      rewriteText = rewrite.src();\r\n\r\n\t      // Append scope information\r\n\t      if (rewrite.scope() !== undefined) {\r\n\t        rewriteText += ': ' + rewrite.scope();\r\n\t      };\r\n\r\n\t      // Append source information\r\n\t      span.addT(rewriteText);\r\n\r\n        comments.push(rewriteText + ' (' + rewrite.operation() + ')');\r\n        \r\n\t      this._el.appendChild(span);\r\n      }, this);\r\n\r\n      e.setAttribute(\"title\", comments.join(\"\\n\"))\r\n\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Add string values to the virtual corpus\r\n */\r\n\r\n\r\ndefine('vc/stringval',['util'], function () {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.REGEX      = loc.REGEX      || 'RegEx';\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Use a regular expression';\r\n\r\n  return {\r\n    /**\r\n     * Create new string value helper.\r\n     */\r\n    create : function () {\r\n      const a = arguments;\r\n      let regexOp = true,\r\n          regex = false,\r\n          value = '';\r\n\r\n      // Set value\r\n      if (a.length >= 1) {\r\n        if (a[0] !== undefined)\r\n          value = a[0];\r\n      };\r\n\r\n      // Set regex\r\n      if (a.length >= 2) {\r\n        if (a[1] !== undefined)\r\n          regex = a[1];\r\n      };\r\n\r\n      // Set regexOp\r\n      if (a.length >= 3) {\r\n        regexOp = a[2];\r\n        if (regexOp === false) {\r\n          regex = false;\r\n        }\r\n      };\r\n      return Object.create(this)._init(value, regex, regexOp);\r\n    },\r\n    \r\n\r\n    // Initialize the string value\r\n    _init : function (value, regex, regexOp) {\r\n      this.value(value);\r\n      this.regex(regex);\r\n      this._regexOp(regexOp);\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the regex boolean value.\r\n     *\r\n     * @param bool Either true or false\r\n     */\r\n    regex : function (bool) {\r\n      if (arguments.length === 1) {\r\n\t      this._regex = bool ? true : false;\r\n        this._update();\r\n      };\r\n      return this._regex;\r\n    },\r\n\r\n\r\n    _regexOp : function (regexOp) {\r\n      if (arguments.length === 1) {\r\n        this.__regexOp = regexOp ? true : false;\r\n        this._update();\r\n      };\r\n      return this.__regexOp;\r\n    },\r\n\r\n\r\n    /**\r\n     * Toggle the regex, make it either true,\r\n     * if it is false, or make it false, if it is true.\r\n     */\r\n    toggleRegex : function () {\r\n      this.regex(this._regex === false ? true : false);\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get or set the string value.\r\n     */\r\n    value : function (val) {\r\n      if (arguments.length === 1) {\r\n        this._value = val;\r\n        // this._input.value = val;\r\n        this._update();\r\n      };\r\n      return this._value;\r\n    },\r\n\r\n\r\n    // Update dom element\r\n    _update : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n      \r\n      this._value = this._input.value;\r\n\r\n      const cl = this._el.classList;\r\n\r\n      if (this._regexOp() && this._regex) {\r\n        cl.add('regex');\r\n      }\r\n      else {\r\n        cl.remove('regex');\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Store the string value.\r\n     * This method should be overwritten.\r\n     * The method receives the value and the regex.\r\n     */\r\n    store : function (v,r) {},\r\n\r\n\r\n    /**\r\n     * Put focus on element\r\n     */\r\n    focus : function () {\r\n      this._el.children[0].focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated dom element.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create element\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n\r\n      const cl = e.classList;\r\n      cl.add('value');\r\n      if (this.regex() === true)\r\n        cl.add('regex');\r\n      \r\n      // Add input field\r\n      this._input = e.addE('input');\r\n\r\n      if (this.value() !== undefined) {\r\n        this._input.value = this.value();\r\n      };\r\n\r\n      // Add regex button\r\n      if (this._regexOp()) {\r\n        const re = e.addE('div');\r\n        re.addEventListener(\r\n          'click',\r\n          function () {\r\n\t          this.toggleRegex();\r\n            // ev.halt();\r\n          }.bind(this),\r\n          true\r\n        );\r\n        re.setAttribute(\"title\", \"Use as regular expression\");\r\n        re.addT('RegEx');\r\n      };\r\n\r\n      // If the focus is not on the text field anymore,\r\n      // delegate focus to\r\n      this._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          const t = this;\r\n          if (!t._inField) {\r\n\t          t.value(t._input.value);\r\n            t.store(t.value(), t.regex());\r\n          };\r\n          ev.halt();\r\n        }.bind(this)\r\n      );\r\n\r\n      // Workaround to check the click is in the field\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function () {\r\n          this._inField = true;\r\n        }.bind(this)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function () {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(this)\r\n      );\r\n\r\n      this._input.addEventListener(\r\n        'keypress',\r\n        function (ev) {\r\n          const t = this;\r\n\t        if (ev.keyCode == 13) {\r\n\t          t.value(t._input.value);\r\n\t          t.store(t.value(), t.regex());\r\n            return false;\r\n\t        };\r\n        }.bind(this)\r\n      );\r\n\r\n      // Add store button\r\n      /*\r\n        e.appendChild(\r\n        document.createElement('div')\r\n        ).addEventListener('click', function () {\r\n        this.store(this.value(), this.regex());\r\n        }.bind(this));\r\n      */\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A reference to another VC.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/docgroupref',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass) {\r\n\r\n  // TODO:\r\n  //   Does not support rewrites currently\r\n  \r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"docGroupRef\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent, json) {\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n\t          upgradeTo(this).\r\n            fromJson(json);\r\n      \r\n      if (obj === undefined)\r\n        console.log(json);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n     \r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n     \r\n      const refTitle = document.createElement('span');\r\n      refTitle.classList.add('key','fixed', 'ref');\r\n      refTitle.addT('referTo');\r\n\r\n      // Added value operator\r\n      const refE = t._refE = document.createElement('span');\r\n      refE.setAttribute('data-type', \"string\");\r\n      refE.setAttribute('class', 'value');\r\n\r\n      if (this.ref()) {\r\n        refE.addT(t.ref());\r\n      }\r\n      else {\r\n        refE.addT(loc.EMPTY);\r\n        refE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      refE.addEventListener(\r\n        'click',\r\n        t._changeRef.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(refTitle);\r\n      e.appendChild(refE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n     \r\n      if (t._parent !== undefined) {\r\n\r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };  \r\n\r\n      if (KorAP.vc !== undefined) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', { 'detail' : t })\r\n        );\r\n      };\r\n      \r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      const e = this._el = document.createElement('div');\r\n      e.setAttribute('class', 'doc groupref');\r\n      this.update();\r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    ref : function (ref) {\r\n      if (arguments.length === 1) {\r\n        this._ref = ref;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._ref;\r\n    },\r\n\r\n\r\n    // Click on the reference operator, show me the option\r\n    _changeRef : function (e) {\r\n      const that = this;\r\n      const str = stringValClass.create(this.ref(), false, false);\r\n      const strElem = str.element();\r\n\r\n      str.store = function (ref, regex) {\r\n        that.ref(ref);\r\n          \r\n        that._el.removeChild(\r\n          this._el\r\n        );\r\n        that.update();\r\n      };\r\n\r\n      // Insert element\r\n      this._el.insertBefore(\r\n        strElem,\r\n        this._refE\r\n      );\r\n\r\n      str.focus();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Wrap a new operation around the doc element.\r\n     * This is copypasta from doc.js\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      if (json === undefined)\r\n        return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"ref\"] === undefined ||\r\n          typeof json[\"ref\"] != 'string') {\r\n        KorAP.log(821, \"Reference is missing\");\r\n        return;\r\n      };\r\n\r\n      this.ref(json[\"ref\"]);\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        this.rewrite(json[\"rewrites\"]);\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n      console.log(\"Do not support click on this\");\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    // TODO: This is identical to doc.js\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      if (!this.ref)\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + this.ldType(),\r\n        \"ref\"   : this.ref()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return this.ref() ? false : true\r\n    },\r\n    \r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      return 'referTo ' + this.ref().quote();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * A new document criterion\r\n */\r\n\r\n\r\ndefine('vc/doc',[\r\n  'vc/jsonld',\r\n  'vc/rewritelist',\r\n  'vc/stringval',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, rewriteListClass, stringValClass, docGroupRefClass) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Improve error handling by using window.onerror() to\r\n   *   capture thrown errors and log them.\r\n   */\r\n\r\n  const errstr802 = \"Match type is not supported by value type\";\r\n  const errstr804 = \"Unknown value type\";\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The JSON-LD type\r\n    _ldType : \"doc\",\r\n\r\n    // The object ... maybe not important\r\n    _obj : function () { return '???'; /*KorAP.Doc*/ },\r\n    \r\n\r\n    /**\r\n     * Create a new document criterion\r\n     * by passing the parent object and a json construct.\r\n     */\r\n    create : function (parent, json) {\r\n\r\n      // Create the object, inheriting from Json-LD class\r\n      const obj = Object(jsonldClass).\r\n            create().\r\n            upgradeTo(this).\r\n            fromJson(json);\r\n\r\n      if (obj === undefined) {\r\n        console.log(json);\r\n        return;\r\n      };\r\n\r\n      // Bind the parent\r\n      if (parent !== undefined)\r\n        obj._parent = parent;\r\n      \r\n      obj.__changed = true;\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the elements content.\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n        return t.element();\r\n      \r\n      // Get element\r\n      const e = t._el;\r\n\r\n      // Check if there is a change in the underlying data\r\n      if (!t.__changed)\r\n        return e;\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      e.refTo = t;\r\n\r\n\r\n      // Was rewritten\r\n      if (t.rewrites() !== undefined) {\r\n        e.classList.add(\"rewritten\");\r\n      };\r\n\r\n      // Added key\r\n      const keyE = t._keyE = document.createElement('span');\r\n      keyE.setAttribute('class', 'key');\r\n\r\n      // Change key\r\n      keyE.addEventListener('click', t._changeKey.bind(t));\r\n\r\n      if (t.key()) {\r\n        const k = t.key();\r\n        if (loc['VC_' + k] !== undefined)\r\n          k = loc['VC_' + k];\r\n        keyE.addT(k);\r\n      };\r\n\r\n      // Added match operator\r\n      const matchopE = t._matchopE = document.createElement('span');\r\n      matchopE.setAttribute('data-type', t.type());\r\n      matchopE.setAttribute('class', 'match');\r\n      matchopE.addT(t.matchop());\r\n\r\n      // Change matchop\r\n      t._matchopE.addEventListener(\r\n        'click',\r\n        t._changeMatchop.bind(t)\r\n      );\r\n\r\n      // Added value operator\r\n      const valueE = t._valueE = document.createElement('span');\r\n      valueE.setAttribute('data-type', t.type());\r\n      valueE.setAttribute('class', 'value');\r\n\r\n      if (t.value()) {\r\n        valueE.addT(t.value());\r\n      }\r\n      else {\r\n        valueE.addT(loc.EMPTY);\r\n        valueE.classList.add('unspecified');\r\n      };\r\n\r\n      // Change value\r\n      valueE.addEventListener(\r\n        'click',\r\n        t._changeValue.bind(t)\r\n      );\r\n\r\n      // Remove all element children\r\n      _removeChildren(e);\r\n\r\n      // Add spans\r\n      e.appendChild(keyE);\r\n      e.appendChild(matchopE);\r\n      e.appendChild(valueE);\r\n\r\n      t.__changed = false;\r\n\r\n      if (t._rewrites !== undefined) {\r\n        e.appendChild(t._rewrites.element());\r\n      };\r\n\r\n      if (t._parent !== undefined) {\r\n        \r\n        // Set operators\r\n        // Append new operators\r\n        e.appendChild(t.operators(\r\n          true,\r\n          true,\r\n          true\r\n        ).element());\r\n      };\r\n      \r\n      if (KorAP.vc){\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      }\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n        return t._el;\r\n\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Wrap a new operation around the doc element\r\n     */\r\n    wrap : function (op) {\r\n      const parent = this.parent();\r\n      const group = require('vc/docgroup').create(parent);\r\n      group.operation(op);\r\n      group.append(this);\r\n      group.append();\r\n      return parent.replaceOperand(this, group).update();\r\n    },\r\n\r\n\r\n    replaceWith : function (op) {\r\n      const p = this.parent();\r\n\r\n      if (p.ldType() === 'docGroup') {\r\n        p.replaceOperand(this, op);\r\n      }\r\n      else if (p.ldType() == null) {\r\n        p.root(op);\r\n      };\r\n\r\n      p.update();\r\n\r\n      this.destroy();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Deserialize from json\r\n     */\r\n    fromJson : function (json) {\r\n      const t = this;\r\n      if (json === undefined)\r\n        return t;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n        KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n        return;\r\n      };\r\n\r\n      if (json[\"value\"] === undefined ||\r\n          typeof json[\"value\"] != 'string') {\r\n        KorAP.log(805, \"Value is invalid\");\r\n        return;\r\n      };\r\n\r\n      let rewrite;\r\n\r\n      // There is a defined key\r\n      if (json[\"key\"] !== undefined &&\r\n          typeof json[\"key\"] === 'string') {\r\n\r\n        // Set key\r\n        t.key(json[\"key\"]);\r\n\r\n        // Set match operation\r\n        if (json[\"match\"] !== undefined) {\r\n          if (typeof json[\"match\"] === 'string') {\r\n            t.matchop(json[\"match\"]);\r\n          }\r\n          else {\r\n            KorAP.log(802, errstr802);\r\n            return;\r\n          };\r\n        };\r\n        \r\n        // Type is unspecified - but may be known by the menu\r\n        if (json[\"type\"] === undefined && KorAP._vcKeyMenu) {\r\n\r\n          // Check the VC list if the field is known\r\n          const type = KorAP._vcKeyMenu.typeOf(t.key());\r\n          if (type != undefined) {\r\n            json[\"type\"] = \"type:\" + type;\r\n          };\r\n        };\r\n\r\n        // Type is still undefined\r\n        if (json[\"type\"] === undefined) {\r\n        \r\n          // Check match type\r\n          if (!KorAP._validUnspecMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is string type\r\n        else if (json[\"type\"] == \"type:string\") {\r\n          t.type(\"string\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n          \r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Field is specified\r\n        else if (json[\"type\"] == \"type:text\") {\r\n          t.type(\"text\");\r\n\r\n          // Check match type\r\n          if (!KorAP._validTextMatchRE.test(t.matchop())) {\r\n            KorAP.log(802, errstr802);\r\n\r\n            // Rewrite method\r\n            t.matchop('eq');\r\n            rewrite = 'modification';\r\n          };\r\n\r\n          // Set string value\r\n          t.value(json[\"value\"]);\r\n        }\r\n\r\n        // Key is a date\r\n        else if (json[\"type\"] === \"type:date\") {\r\n          t.type(\"date\");\r\n\r\n          if (json[\"value\"] !== undefined &&\r\n              KorAP._validDateRE.test(json[\"value\"])) {\r\n\r\n            if (!KorAP._validDateMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            // Set value\r\n            t.value(json[\"value\"]);\r\n          }\r\n          else {\r\n            KorAP.log(806, \"Value is not a valid date string\");\r\n            return;\r\n          };\r\n        }\r\n\r\n        // Key is a regular expression\r\n        else if (json[\"type\"] === \"type:regex\") {\r\n          t.type(\"regex\");\r\n\r\n          try {\r\n\r\n            // Try to create a regular expression\r\n            let check = new RegExp(json[\"value\"]);\r\n\r\n            if (!KorAP._validStringMatchRE.test(t.matchop())) {\r\n              KorAP.log(802, errstr802);\r\n\r\n              // Rewrite method\r\n              t.matchop('eq');\r\n              rewrite = 'modification';\r\n            };\r\n\r\n            t.value(json[\"value\"]);\r\n          }\r\n\r\n          catch (e) {\r\n            KorAP.log(807, \"Value is not a valid regular expression\");\r\n            return;\r\n          };\r\n          t.type(\"regex\");\r\n        }\r\n\r\n        else {\r\n          KorAP.log(804, errstr804 + \": \" + t.type());\r\n          throw new Error(errstr804 + \": \" + t.type());\r\n        };\r\n      };\r\n\r\n      // Rewrite coming from the server\r\n      if (json[\"rewrites\"] !== undefined) {\r\n        t.rewrite(json[\"rewrites\"]);\r\n      }\r\n\r\n      // Rewrite coming from Kalamar\r\n      else if (rewrite !== undefined) {\r\n        t.rewrite(rewrite);\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the key\r\n     */\r\n    key : function (value) {\r\n      if (arguments.length === 1) {\r\n        this._key = value;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._key;\r\n    },\r\n\r\n\r\n    // Click on the key, show me the menu\r\n    _changeKey : function (e) {\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._keyE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (key, type) {\r\n\r\n        if (type === 'ref') {\r\n          // KorAP._delete.bind(that);\r\n          that.replaceWith(\r\n            docGroupRefClass.create(that.parent())\r\n          );\r\n        }\r\n\r\n        else {\r\n          const doc = that.key(key).type(type);\r\n\r\n          // This may not be compatible - then switch to default\r\n          doc.matchop(doc.matchop());\r\n          doc.value(doc.value());\r\n\r\n          // Update the doc\r\n          doc.update();\r\n        };\r\n\r\n        // hide!\r\n        this.hide();\r\n      });\r\n\r\n      // TODO: Highlight the old value!\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the match operator\r\n     */\r\n    matchop : function (match) {\r\n      const t = this;\r\n\r\n      if (arguments.length === 1) {\r\n        const m = match.replace(/^match:/, '');\r\n\r\n        if (\r\n          (t._type == undefined) // && KorAP._validUnspecMatchRE.test(m))\r\n            ||\r\n            (\r\n              (t._type === 'string' || t._type === 'regex') &&\r\n                KorAP._validStringMatchRE.test(m)\r\n            )\r\n            ||\r\n            (t._type === 'text' && KorAP._validTextMatchRE.test(m))\r\n            ||\r\n            (t._type === 'date' && KorAP._validDateMatchRE.test(m))\r\n        ) {\r\n          t._matchop = m;\r\n        }\r\n        else {\r\n          t._matchop = \"eq\";\r\n        };\r\n\r\n        t._changed();\r\n        return t;\r\n      };\r\n\r\n      return t._matchop || \"eq\";\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeMatchop : function (e) {\r\n      const menu = KorAP._vcMatchopMenu[this.type()];\r\n\r\n      if (menu === undefined) {\r\n        KorAP.log(0, \"Unable to init menu for \" + this.type());\r\n        return;\r\n      };\r\n\r\n      // Insert menu\r\n      this._el.insertBefore(\r\n        menu.element(),\r\n        this._matchopE\r\n      );\r\n\r\n      // Release event\r\n      const that = this;\r\n      menu.released(function (mo) {\r\n        that.matchop(mo).update();\r\n        this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the type\r\n     */\r\n    type : function (type) {\r\n      if (arguments.length === 1) {\r\n        this._type = type;\r\n        this._changed();\r\n        return this;\r\n      };\r\n      return this._type || \"string\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the value\r\n     */\r\n    value : function (value) {\r\n      const t = this;\r\n      if (arguments.length === 1) {\r\n        if (t._type === 'date' && !KorAP._validDateRE.test(value)) {\r\n          delete t._value;\r\n        }\r\n        else {\r\n          t._value = value;\r\n        };\r\n        t._changed();\r\n        return t;\r\n      };\r\n      return t._value;\r\n    },\r\n\r\n\r\n    // Click on the match operator, show me the menu\r\n    _changeValue : function (e) {\r\n      const that = this;\r\n     \r\n      // Show datepicker\r\n      if (this.type() === 'date') {\r\n        const dp = KorAP._vcDatePicker;\r\n        dp.fromString(this.value());\r\n\r\n        // Todo: change this\r\n        dp.onclick(function (selected) {\r\n\r\n          // There are values selected\r\n          if (selected['year']) {\r\n            that.value(this.toString());\r\n            that.update();\r\n            return;\r\n          };\r\n\r\n          // Remove datepicker\r\n          that._el.removeChild(\r\n            dp.element()\r\n          );\r\n        });\r\n\r\n        this._el.insertBefore(\r\n          dp.show(), // Get element of the date picker\r\n          this._valueE\r\n        );\r\n\r\n        dp.input().focus();\r\n      }\r\n\r\n      else {\r\n        const regex = this.type() === 'regex' ? true : false;\r\n        const str = stringValClass.create(this.value(), regex);\r\n        const strElem = str.element();\r\n\r\n        str.store = function (value, regex) {\r\n          that.value(value);\r\n          if (regex === true)\r\n            that.type('regex');\r\n          else\r\n            that.type('string');\r\n          \r\n          that._el.removeChild(\r\n            this._el\r\n          );\r\n          that.update();\r\n        };\r\n\r\n        // Insert element\r\n        this._el.insertBefore(\r\n          strElem,\r\n          this._valueE\r\n        );\r\n\r\n        str.focus();\r\n      };\r\n    },\r\n\r\n\r\n    rewrites : function () {\r\n      return this._rewrites;\r\n    },\r\n\r\n\r\n    rewrite : function (value) {\r\n      if (typeof value === 'string') {\r\n        value = [{\r\n          \"@type\" : \"koral:rewrite\",\r\n          \"operation\" : \"operation:\" + value,\r\n          \"src\" : \"Kalamar\"\r\n        }];\r\n      };\r\n      this._rewrites = rewriteListClass.create(value);\r\n    },\r\n\r\n\r\n    // Mark the underlying data as being changed.\r\n    // This is important for rerendering the dom.\r\n    // This will also remove rewrite markers, when the data\r\n    // change happened by the user\r\n    _changed : function () {\r\n      this.__changed = true;\r\n\r\n      if (this._rewrites === undefined)\r\n        return;\r\n\r\n      delete this[\"_rewrites\"];\r\n      \r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      this._el.classList.remove(\"rewritten\");\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const t = this;\r\n\r\n      if (!t.matchop() || !t.key())\r\n        return {};\r\n      \r\n      return {\r\n        \"@type\" : \"koral:\" + t.ldType(),\r\n        \"key\"   : t.key(),\r\n        \"match\" : \"match:\" + t.matchop(),\r\n        \"value\" : t.value() || '',\r\n        \"type\"  : \"type:\" + t.type()\r\n      };\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return !(this.matchop() && this.key() && this.value());\r\n    },\r\n\r\n\r\n    toQuery : function () {\r\n      if (this.incomplete())\r\n        return \"\";\r\n\r\n      // Build doc string based on key\r\n      let string = this.key() + ' ';\r\n\r\n      // Add match operator\r\n      switch (this.matchop()) {\r\n      case \"ne\":\r\n        string += '!=';\r\n        break;\r\n      case \"contains\":\r\n        string += '~';\r\n        break;\r\n      case \"excludes\":\r\n        string += '!~';\r\n        break;\r\n      case \"containsnot\":\r\n        string += '!~';\r\n        break;\r\n      case \"geq\":\r\n        string += 'since';\r\n        break;\r\n      case \"leq\":\r\n        string += 'until';\r\n        break;\r\n      default:\r\n        string += (this.type() == 'date') ? 'in' : '=';\r\n        break;\r\n      };\r\n\r\n      string += ' ';\r\n\r\n      // Add value\r\n      switch (this.type()) {\r\n      case \"date\":\r\n        return string + this.value();\r\n      case \"regex\":\r\n        return string + '/' + this.value().escapeRegex() + '/';\r\n      case \"string\":\r\n      case \"text\":\r\n        return string + this.value().quote();\r\n      };\r\n\r\n      return \"\";\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * An unspecified criterion in a virtual corpus.\r\n * Inherits everything from jsonld\r\n */\r\n\r\n\r\ndefine('vc/unspecified',[\r\n  'vc/jsonld',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass, docClass, docGroupRefClass) {\r\n\r\n  // Localize empty string\r\n  const loc = KorAP.Locale;\r\n  loc.EMPTY = loc.EMPTY || '⋯';\r\n\r\n  return {\r\n\r\n    // The ld-type\r\n    _ldType : \"non\",\r\n\r\n    /**\r\n     * Create new unspecified criterion\r\n     * with a link to the parent object\r\n     */\r\n    create : function (parent) {\r\n      const obj = Object.create(jsonldClass).\r\n\t        upgradeTo(this);\r\n\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the key; this will spawn a new doc\r\n     */\r\n    key : function (v) {\r\n\r\n      // Not replaceable\r\n      if (this._parent === undefined)\r\n\t      return null;\r\n\r\n      let newDoc;\r\n      const keyType = KorAP._vcKeyMenu.typeOf(v);\r\n\r\n      // Set JSON-LD type\r\n      if (keyType && keyType === 'ref') {\r\n        newDoc = docGroupRefClass.create(this._parent);\r\n      }\r\n      else {\r\n        newDoc = docClass.create(this._parent);\r\n        newDoc.key(v);\r\n        newDoc.type(keyType);\r\n      };\r\n  \r\n      // Unspecified document on root\r\n      if (this._parent.ldType() === null) {\r\n\t      this._parent.root(newDoc);\r\n\t      this.destroy();\r\n      }\r\n\r\n      // Unspecified document in group\r\n      else {\r\n\t      this._parent.replaceOperand(this, newDoc);\r\n      };\r\n      this._parent.update();\r\n      return newDoc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the element\r\n     */\r\n    update : function () {\r\n      const t = this;\r\n\r\n      if (t._el === undefined)\r\n\t      return t.element();\r\n\r\n      // Remove element content\r\n      _removeChildren(t._el);\r\n\r\n      const ellipsis = document.createElement('span');\r\n      ellipsis.addT(loc.EMPTY);\r\n\r\n      // Click on empty criterion\r\n      ellipsis.addEventListener('click', t.onclick.bind(t));\r\n\r\n      t._el.appendChild(ellipsis);\r\n\r\n      // Set ref - TODO: Cleanup!\r\n      t._el.refTo = t;\r\n\r\n      // Set operators\r\n      if (t._parent !== undefined &&\r\n          t.parent().ldType() !== null) {\r\n\r\n\t      t._el.appendChild(\r\n\t        t.operators(\r\n\t          false,\r\n\t          false,\r\n\t          true\r\n\t        ).element()\r\n\t      );\r\n      };\r\n\r\n      return t.element();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the associated element\r\n     */\r\n    element : function () {\r\n      const t = this;\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n      t._el = document.createElement('div');\r\n      t._el.setAttribute('class', 'doc unspecified');\r\n      t.update();\r\n      return t._el;\r\n    },\r\n\r\n\r\n    incomplete : function () {\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Click on the unspecified object\r\n     */\r\n    onclick : function () {\r\n\r\n      // Get the key menu\r\n      const menu = KorAP._vcKeyMenu;\r\n\r\n      // Add key menu element at the correct position\r\n      this._el.insertBefore(\r\n\t      menu.element(),\t\r\n\t      this._el.firstChild\r\n      );\r\n\r\n      const that = this;\r\n\r\n      // Set released method\r\n      menu.released(function (key) {\r\n\t      // Set chosen key and type - will return a doc\r\n\t      that.key(key).update();\r\n\t      this.hide();\r\n      });\r\n\r\n      menu.show();\r\n      menu.focus();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Document group criterion\r\n */\r\n/*\r\n * TODO: Let the UPDATE event bubble up through parents!\r\n */\r\n\r\n\r\ndefine('vc/docgroup',[\r\n  'vc/jsonld',\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroupref',\r\n  'util'\r\n], function (jsonldClass,\r\n\t           unspecClass,\r\n\t           docClass,\r\n             docGroupRefClass) {\r\n\r\n  const _validGroupOpRE = new RegExp(\"^(?:and|or)$\");\r\n\r\n  const docGroupClass = {\r\n\r\n    _ldType : \"docGroup\",\r\n\r\n    create : function (parent, json) {\r\n      const obj = Object.create(jsonldClass).upgradeTo(this);\r\n      obj._operands = [];\r\n      obj.fromJson(json);\r\n      if (parent !== undefined)\r\n\t      obj._parent = parent;\r\n      return obj;\r\n    },\r\n    \r\n\r\n    newAfter : function (obj) {\r\n      this._operands.forEach(function (op, i) {\r\n\t      if (op === obj) {\r\n\t        const operand = unspecClass.create(this);\r\n\t        this._operands.splice(i + 1, 0, operand);\r\n\t        return this.update();\r\n\t      };\r\n      }, this);\r\n    },\r\n\r\n\r\n    // The doc is already set in the group\r\n    _duplicate : function (operand) {\r\n\r\n      // TODO:\r\n      //   Also check for duplicate docGroupRefs!\r\n      if (operand.ldType() !== 'doc')\r\n\t      return null;\r\n\r\n      const f = this._operands.find(\r\n        op => \r\n\t        op.ldType() === 'doc'\r\n\t        && operand.key() === op.key()\r\n\t        && operand.matchop() === op.matchop()\r\n\t        && operand.value() === op.value()\r\n      );\r\n\r\n      if (f)\r\n        return f;\r\n\r\n      return null;\r\n    },\r\n    \r\n\r\n    append : function (operand) {\r\n      \r\n      // Append unspecified object\r\n      if (operand === undefined) {\r\n\r\n\t      // Be aware of cyclic structures!\r\n\t      operand = unspecClass.create(this);\r\n\t      this._operands.push(operand);\r\n\t      return operand;\r\n      };\r\n      \r\n      switch (operand[\"@type\"]) {\r\n\t      \r\n      case undefined:\r\n\t      // No @type defined\r\n\t      if (operand[\"ldType\"] !== undefined) {\r\n\t        if (operand.ldType() !== 'doc' &&\r\n\t            operand.ldType() !== 'docGroup' &&\r\n              operand.ldType() !== 'docGroupRef') {\r\n\t          KorAP.log(812, \"Operand not supported in document group\");\r\n\t          return;\r\n\t        };\r\n\r\n\t        // Be aware of cyclic structures!\r\n\t        operand.parent(this);\r\n\r\n\t        const dupl = this._duplicate(operand);\r\n\t        if (dupl === null) {\r\n\t          this._operands.push(operand);\r\n\t          return operand;\r\n\t        };\r\n\t        return dupl;\r\n\t      };\r\n\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n\r\n      case \"koral:doc\":\r\n\t      // Be aware of cyclic structures!\r\n\t      const doc = docClass.create(this, operand);\r\n\t      if (doc === undefined)\r\n\t        return;\r\n        \r\n\t      const dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n\r\n      case \"koral:docGroup\":\r\n\r\n        // Be aware of cyclic structures!\r\n\t      const docGroup = docGroupClass.create(this, operand);\r\n\t      if (docGroup === undefined)\r\n\t        return;\r\n\r\n\t      // Flatten group\r\n\t      if (docGroup.operation() === this.operation()) {\r\n          docGroup.operands().forEach(function(op) {\r\n\t          const dupl = this._duplicate(op);\r\n\t          if (dupl === null) {\r\n\t            this._operands.push(op);\r\n\t            op.parent(this);\r\n\t          };\r\n\t        }, this);\r\n\t        docGroup._operands = [];\r\n\t        docGroup.destroy();\r\n\t        return this;\r\n\t      };\r\n\t      this._operands.push(docGroup);\r\n\t      return docGroup;\r\n\r\n      case \"koral:docGroupRef\":\r\n      \r\n        const docGroupRef = docGroupRefClass.create(this, operand);\r\n      \r\n        if (docGroupRef === undefined)\r\n          return\r\n\r\n        // TODO:\r\n        //   Currently this doesn't do anything meaningful,\r\n        //   as duplicate only checks on docs for the moment\r\n        /*\r\n\t      var dupl = this._duplicate(doc);\r\n\t      if (dupl === null) {\r\n\t        this._operands.push(doc);\r\n\t        return doc;\r\n\t      };\r\n\t      return dupl;\r\n        */\r\n\t      this._operands.push(docGroupRef);\r\n        return docGroupRef;\r\n\r\n      default:\r\n\t      KorAP.log(812, \"Operand not supported in document group\");\r\n\t      return;\r\n      };\r\n    },\r\n\r\n\r\n    update : function () {\r\n      const t = this;\r\n\r\n      // There is only one operand in group\r\n      \r\n      if (t._operands.length === 1) {\r\n\t      \r\n\t      const parent = t.parent();\r\n\t      const op = t.getOperand(0);\r\n\t      \r\n\t      // This will prevent destruction of\r\n\t      // the operand\r\n\t      t._operands = [];\r\n\r\n\t      // Parent is a group\r\n\t      if (parent.ldType() !== null)\r\n\t        return parent.replaceOperand(t, op).update();\r\n\r\n\t      // Parent is vc\r\n\t      else {\r\n\t        t.destroy();\r\n\t        // Cyclic madness\r\n\t        parent.root(op);\r\n\t        op.parent(parent);\r\n\t        return parent.root();\r\n\t      };\r\n      };\r\n\r\n      if (t._el === undefined)\r\n\t      return t;\r\n\r\n      const group = t._el;\r\n      group.setAttribute('data-operation', t.operation());\r\n\r\n      _removeChildren(group);\r\n\r\n      // Append operands\r\n      t._operands.forEach(\r\n        op => group.appendChild(op.element())\r\n      );\r\n\r\n      // Set operators\r\n      var op = t.operators(\r\n\t      t.operation() == 'and' ? false : true,\r\n\t      t.operation() == 'or'  ? false : true,\r\n\t      true\r\n      );\r\n\r\n      group.appendChild(op.element());\r\n\r\n      if (KorAP.vc) {\r\n        KorAP.vc.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail' : t})\r\n        );\r\n      };\r\n      \r\n      return t;\r\n    },\r\n\r\n\r\n    element : function () {\r\n      const t = this;\r\n\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      const e = t._el = document.createElement('div');\r\n      e.setAttribute('class', 'docGroup');\r\n\r\n      // Update the object - including optimization\r\n      t.update();\r\n\r\n      return e;\r\n    },\r\n\r\n\r\n    operation : function (op) {\r\n      if (arguments.length === 1) {\r\n\t      if (_validGroupOpRE.test(op)) {\r\n\t        this._op = op;\r\n\t      }\r\n\t      else {\r\n\t        KorAP.log(810, \"Unknown operation type\");\r\n\t        return;\r\n\t      };\r\n      };\r\n      return this._op || 'and';\r\n    },\r\n\r\n\r\n    operands : function () {\r\n      return this._operands;\r\n    },\r\n\r\n\r\n    getOperand : function (index) {\r\n      return this._operands[index];\r\n    },\r\n\r\n\r\n    // Replace operand\r\n    replaceOperand : function (oldOp, newOp) {\r\n      \r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\r\n\t      if (this._operands[i] === oldOp) {\r\n\t        \r\n\t        // Just insert a doc or ...\r\n\t        if (newOp.ldType() === \"doc\" ||\r\n\t            newOp.ldType() === \"non\" ||\r\n              newOp.ldType() === 'docGroupRef' ||\r\n\t            // ... insert a group of a different operation\r\n\t            // (i.e. \"and\" in \"or\"/\"or\" in \"and\")\r\n\t            newOp.operation() != this.operation()) {\r\n\t          this._operands[i] = newOp;\r\n\t          newOp.parent(this);\r\n\t        }\r\n\r\n\t        // Flatten group\r\n\t        else {\r\n\r\n            // Remove old group\r\n\t          this._operands.splice(i, 1);\r\n\r\n\t          // Inject new operands\r\n            newOp.operands().reverse().forEach(\r\n              function(op) {\r\n\t              this._operands.splice(i, 0, op);\r\n\t              op.parent(this);\r\n\t            },\r\n              this\r\n            );\r\n\r\n\t          // Prevent destruction of operands\r\n\t          newOp._operands = [];\r\n\t          newOp.destroy();\r\n\t        };\r\n\r\n\t        oldOp.destroy();\r\n\t        return this;\r\n\t      }\r\n      };\r\n      return false;\r\n    },\r\n\r\n\r\n    // Delete operand from group\r\n    delOperand : function (obj) {\r\n\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n\t      if (this._operands[i] === obj) {\r\n\t        \r\n\t        // Delete identified operand\r\n\t        this._operands.splice(i,1);\r\n\r\n\t        // Destroy object for cyclic references\r\n\t        obj.destroy();\r\n\r\n\t        return this;\r\n\t      };\r\n      };\r\n\r\n      // Operand not found\r\n      return undefined;\r\n    },\r\n    \r\n\r\n    // Deserialize from json\r\n    fromJson : function (json) {\r\n\r\n      if (json === undefined)\r\n\t      return this;\r\n\r\n      if (json[\"@type\"] === undefined) {\r\n\t      KorAP.log(701, \"JSON-LD group has no @type attribute\");\r\n\t      return;\r\n      };\r\n\r\n      if (json[\"operation\"] === undefined ||\r\n\t        typeof json[\"operation\"] !== 'string') {\r\n\t      KorAP.log(811, \"Document group expects operation\");\r\n\t      return;\r\n      };\r\n\r\n      const operation = json[\"operation\"];\r\n\r\n      this.operation(operation.replace(/^operation:/,''));\r\n\r\n      if (json[\"operands\"] === undefined ||\r\n\t        !(json[\"operands\"] instanceof Array)) {\r\n\t      KorAP.log(704, \"Operation needs operand list\")\r\n\t      return;\r\n      };\r\n\r\n      // Add all documents\r\n      json[\"operands\"].forEach(i => this.append(i));\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    toJson : function () {\r\n      const opArray = new Array();\r\n      this._operands.forEach(function(op) {\r\n\t      if (op.ldType() !== 'non')\r\n\t        opArray.push(op.toJson());\r\n      });\r\n\r\n      return {\r\n\t      \"@type\"     : \"koral:\" + this.ldType(),\r\n\t      \"operation\" : \"operation:\" + this.operation(),\r\n\t      \"operands\"  : opArray\r\n      };\r\n    },\r\n\r\n\r\n    toQuery : function (brackets) {\r\n      var list = this._operands\r\n\t        .filter(function (op) {\r\n            return !op.incomplete();\r\n\t        })\r\n\t        .map(function (op) {\r\n\t          return (op.ldType() === 'docGroup') ?\r\n\t            op.toQuery(true) :\r\n\t            op.toQuery();\r\n\t        });\r\n      \r\n      if (list.length === 1)\r\n\t      return list.join('');\r\n      else {\r\n\t      const str = list.join(this.operation() === 'or' ? ' | ' : ' & ');\r\n\t      return brackets ? '(' + str + ')' : str;\r\n      };\r\n    }\r\n  };\r\n  \r\n  return docGroupClass;\r\n});\r\n\n// Field menu item\r\n\r\n\r\ndefine('vc/item',['menu/item', 'util'], function (itemClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item.\r\n     * Pass two parameters: value and type.\r\n     * the value may be localized by a name in\r\n     * KorAP.Locale with the prefix 'VC_',\r\n     * e.g. 'VC_subTitle'.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n\r\n    // Initialize item object\r\n    _init : function (params) {\r\n      const t = this;\r\n\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      t._key = params[0];\r\n      t._type  = params[1];\r\n\r\n      const k = t._key;\r\n      t._name  = loc[\"VC_\" + k] ? loc[\"VC_\" + k] : k;\r\n\r\n      t._lcField = ' ' + t._name.toLowerCase();\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click event by passing all clicks\r\n     * to the menu object.\r\n     */\r\n    onclick : function (e) {\r\n      this.menu().release(\r\n\t      this._key,\r\n\t      this._type\r\n      );\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the name of the item.\r\n     * This is a potential localized version\r\n     * of the value.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the type of the item.\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the key of the item.\r\n     */\r\n    key : function () {\r\n      return this._key;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the item. \r\n     */\r\n    element : function () {\r\n      const t = this;\r\n\r\n      // already defined\r\n      if (t._el !== undefined)\r\n\t      return t._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n      if (t._type)\r\n        li.setAttribute(\"data-type\", t._type);\r\n\r\n      li.setAttribute(\"data-key\",  t._key);\r\n\r\n      // Connect action\r\n      li[\"onclick\"] = t.onclick.bind(t);\r\n\r\n      li.addT(t._name);\r\n      return t._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('vc/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      var value = this.value();\r\n      m.release(value, \"string\");\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Menu showing all key fields.\r\n */\r\n\r\n\r\ndefine('vc/menu',[\r\n  'menu',\r\n  'vc/item',\r\n  'vc/prefix'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass) {\r\n\r\n  return {\r\n\r\n    create : function (params) {\r\n      const obj = Object.create(menuClass)\r\n            .upgradeTo(this)\r\n            ._init(params, {\r\n              itemClass : itemClass,\r\n              prefixClass : prefixClass\r\n            });\r\n      obj.limit(6);\r\n\r\n      // This is only domspecific\r\n      obj.element().addEventListener(\r\n        'blur', function (e) {\r\n          this.menu.hide();\r\n        }\r\n      );\r\n \r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Register callback for click event.\r\n     */\r\n    released : function (cb) {\r\n      this._cb = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * A click event was released\r\n     */\r\n    release : function (key, type) {\r\n      if (this._cb !== undefined)\r\n        this._cb(key, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a key type based on a key.\r\n     * This is a linear search, but should work okay for small\r\n     * VCs and small key lists.\r\n     */\r\n    typeOf : function (key) {\r\n      const found = this._items.find(i => i.key() === key);\r\n\r\n      if (found)\r\n        return found.type();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * \r\n * Creates and displays corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n * \r\n */\r\n\r\n\r\n\r\ndefine('vc/statistic',[ 'util' ], function() {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new statistic object\r\n     */\r\n    create : function (statistic) {\r\n      return Object.create(this)._init(statistic);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize statistic object\r\n     */\r\n    _init : function (statistic) {\r\n      if (statistic === undefined) {\r\n        throw new Error(\"Missing parameter\");\r\n      } else {\r\n        this._statistic = statistic;\r\n        return this;\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Display statistic object as HTML Description List Element\r\n     */\r\n    element : function () {\r\n\r\n      // if this._el already exists return without doing something\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      }\r\n\r\n      // create HTML Description List Element\r\n      const statDL = document.createElement('dl');\r\n      statDL.classList.add(\"flex\");\r\n\r\n      const statistic = this._statistic;\r\n      let statSp, statDT, statDD;\r\n\r\n      Object.keys(statistic).forEach(function (k) {\r\n        statSp = statDL.addE('div')\r\n        statDT = statSp.addE('dt');\r\n        statDT.addT(k);\r\n        statDT.setAttribute('title', k);\r\n        statDD = statSp.addE('dd');\r\n        statDD.addT(new Number(statistic[k]).toLocaleString());\r\n      });\r\n\r\n      this._el = statDL;\r\n      return this._el;\r\n    }\r\n  }\r\n\r\n});\r\n\n/**\r\n * Date picker for the\r\n * Virtual Collection builder.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('datepicker',['util'], function () {\r\n\r\n  KorAP._validDateMatchRE = new RegExp(\"^(?:[lg]?eq|ne)$\");\r\n  KorAP._validDateRE      = new RegExp(\"^(?:\\\\d{4})(?:-\\\\d\\\\d(?:-\\\\d\\\\d)?)?$\");\r\n\r\n  /*\r\n   * Localizations\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.WDAY = loc.WDAY || [\r\n    'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'\r\n  ];\r\n  loc.MONTH = loc.MONTH || [\r\n    'January', 'February', 'March', 'April',\r\n    'May', 'June', 'July', 'August',\r\n    'September', 'October', 'November',\r\n    'December'\r\n  ];\r\n\r\n  const d = document;\r\n\r\n  // The datepicker class\r\n  return {\r\n\r\n    /**\r\n     * Create a new datepicker view.\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n\r\n    // Init datepicker\r\n    _init : function () {\r\n      this._selected = [];\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or select a specific date.\r\n     */\r\n    select : function (year, month, day) {\r\n      const t = this;\r\n      if (arguments.length >= 1) {\r\n        t._selected = {'year' : year};\r\n        t._showYear = year;\r\n        if (arguments.length >= 2) {\r\n          t._selected['month'] = month;\r\n          t._showMonth = month;\r\n          if (arguments.length >= 3) {\r\n            t._selected['day'] = day;\r\n            t._showDay = day;\r\n          };\r\n        };\r\n\r\n        return t;\r\n      };\r\n\r\n      return t._selected;\r\n    },\r\n\r\n\r\n    /**\r\n     * Select a specific date and\r\n     * init the accompanied action.\r\n     */\r\n    set : function (year, month, day) {\r\n      this.select(year, month, day);\r\n      this._store();\r\n    },\r\n\r\n\r\n    // Store the selected value\r\n    _store : function () {\r\n      if (this._click !== undefined)\r\n        this._click(this._selected);\r\n      else \r\n        console.dir(this._selected);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Set the action for clicking as a callback.\r\n     * The callback will retrieve a an object with\r\n     * an optional year attribute,\r\n     * an optional month attribute,\r\n     * and an optional day attribute\r\n     */\r\n    onclick : function (cb) {\r\n      this._click = cb;\r\n    },\r\n\r\n\r\n    /**\r\n     * The associated input field.\r\n     */\r\n    input : function () {\r\n      return this._input;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Show the datepicker.\r\n     * Will either show the selected year/month\r\n     * or the current date.\r\n     * Will return the element for appending to the dom.\r\n     */\r\n    show : function (year, month) {\r\n\r\n      const e = this._el = d.createElement('div');\r\n      e.setAttribute('tabindex', 0);\r\n      e.style.outline = 0;\r\n      e.classList.add('datepicker');\r\n      \r\n      const today = new Date();\r\n      const t = this;\r\n\r\n      // Show year\r\n      t._showYear = (year !== undefined) ? year :\r\n        (t._selected['year'] ? this._selected['year'] :\r\n         today.getYear() + 1900);\r\n\r\n      // Show month\r\n      t._showMonth = month ? month :\r\n        (t._selected['month'] ? t._selected['month'] :\r\n         (today.getMonth() + 1));\r\n\r\n      // Append all helpers\r\n      e.appendChild(t._monthHelper());\r\n      e.appendChild(t._yearHelper());\r\n      e.appendChild(t._dayHelper());\r\n      t._input = e.appendChild(t._stringHelper());\r\n\r\n      // Always focus\r\n      e.addEventListener(\r\n        'mousedown',\r\n        function (ev) {\r\n          this._inField = true\r\n        }.bind(t)\r\n      );\r\n\r\n      e.addEventListener(\r\n        'mouseup',\r\n        function (ev) {\r\n          this._inField = false;\r\n          this._input.focus();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.addEventListener(\r\n        'blur',\r\n        function (ev) {\r\n          if (!this._inField) {\r\n            if (this.fromString(this._input.value)) {\r\n              this._store();\r\n            };\r\n          };\r\n          ev.halt();\r\n        }.bind(t)\r\n      );\r\n\r\n      t._input.focus();\r\n\r\n      return t._el;\r\n    },\r\n\r\n    _stringHelper : function () {\r\n\r\n      // Create element\r\n      // Add input field\r\n      const input = d.createElement('input');\r\n      input.value = this.toString();\r\n      input.setAttribute('tabindex', 0);\r\n\r\n      input.addEventListener(\r\n        'keyup',\r\n        function (e) {\r\n          if (this.fromString(input.value)) {\r\n            this._updateYear();\r\n            this._updateMonth();\r\n            this._updateDay();\r\n          };\r\n        }.bind(this)\r\n      );\r\n\r\n      input.addEventListener(\r\n        'keypress',\r\n        function (e) {\r\n          if (e.keyCode == 13) {\r\n            if (this.fromString(input.value))\r\n              this._store();\r\n\r\n            e.halt();\r\n            return false;\r\n          }\r\n        }.bind(this)\r\n      )\r\n\r\n      return input;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the HTML element associated with the datepicker.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current date in string format.\r\n     */\r\n    today : function () {\r\n      const today = new Date();\r\n      let str = today.getYear() + 1900;\r\n      const m = today.getMonth() + 1;\r\n      const d = today.getDate();\r\n      str += '-' + (m < 10 ? '0' + m : m);\r\n      str += '-' + (d < 10 ? '0' + d : d);\r\n      return str;\r\n    },\r\n\r\n\r\n    /**\r\n     * Stringification\r\n     */\r\n    toString : function () {\r\n      // There are values selected\r\n      let v = '';\r\n      const s = this._selected;\r\n      if (s['year']) {\r\n        v += s['year'];\r\n        if (s['month']) {\r\n          v += '-';\r\n          v += s['month'] < 10 ? '0' + s['month'] : s['month'];\r\n          if (s['day']) {\r\n            v += '-';\r\n            v += s['day'] < 10 ? '0' + s['day'] : s['day'];\r\n          };\r\n        };\r\n      };\r\n      return v;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the year.\r\n     */\r\n    incrYear : function () {\r\n      const t = this;\r\n      if (t._showYear < 9999) {\r\n        t._showYear++;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the year.\r\n     */\r\n    decrYear : function () {\r\n      const t = this;\r\n      if (t._showYear > 0) {\r\n        t._showYear--;\r\n        t._updateYear();\r\n        t._updateMonth();\r\n        t._updateDay();\r\n        return t;\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Increment the month.\r\n     */\r\n    incrMonth : function () {\r\n      const t = this;\r\n      t._showMonth++;\r\n      if (t._showMonth > 12) {\r\n        t._showMonth = 1;\r\n        t.incrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Decrement the month.\r\n     */\r\n    decrMonth : function () {\r\n      const t = this;\r\n      t._showMonth--;\r\n      if (t._showMonth < 1) {\r\n        t._showMonth = 12;\r\n        t.decrYear();\r\n      }\r\n      else {\r\n        t._updateMonth();\r\n        t._updateDay();\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    // Create the year helper element.\r\n    _yearHelper : function () {\r\n      const t = this;\r\n      const year = d.createElement('div');\r\n      year.classList.add('year');\r\n\r\n      // Decrement year\r\n      year.addE('span')\r\n        .onclick = t.decrYear.bind(t);\r\n\r\n      t._yElement = year.addE('span');\r\n      t._yElement.addT(t._showYear);\r\n\r\n      t._yElement.onclick = function () {\r\n        t.set(t._showYear);\r\n      }.bind(t);\r\n      t._selectYear();\r\n\r\n      // Increment year\r\n      year.addE('span')\r\n        .onclick = t.incrYear.bind(t);\r\n\r\n      return year;\r\n    },\r\n\r\n\r\n    // Update the year helper view.\r\n    _updateYear : function () {\r\n      this._yElement.firstChild.data = this._showYear;\r\n      this._selectYear();\r\n    },\r\n\r\n\r\n    // Check if the viewed year is current\r\n    _selectYear : function () {\r\n      if (this._showYear === this.select()['year'])\r\n        this._yElement.classList.add('selected');\r\n      else\r\n        this._yElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the month helper element.\r\n    _monthHelper : function () {\r\n      const t = this;\r\n      const month = d.createElement('div');\r\n      month.classList.add('month');\r\n\r\n      // Decrement month\r\n      month.addE('span')\r\n        .onclick = t.decrMonth.bind(t);\r\n      \r\n      t._mElement = month.addE('span');\r\n      t._mElement.addT(loc.MONTH[t._showMonth-1]);\r\n      t._mElement.onclick = function () {\r\n        this.set(this._showYear, this._showMonth);\r\n      }.bind(t);\r\n\r\n      t._selectMonth();\r\n      \r\n      // Increment month\r\n      month.addE('span')\r\n        .onclick = t.incrMonth.bind(t);\r\n\r\n      return month;\r\n    },\r\n\r\n    // Update the month helper view.\r\n    _updateMonth : function () {\r\n      if (this._showMonth === undefined || this._showMonth > 12)\r\n        this._showMonth = 1;\r\n\r\n      this._mElement.firstChild.data = loc.MONTH[this._showMonth-1];\r\n      this._selectMonth();\r\n    },\r\n\r\n\r\n    // Check if the viewed month is current\r\n    _selectMonth : function () {\r\n      const t = this;\r\n      if (t._showYear === t.select()['year'] &&\r\n          t._showMonth === t.select()['month'])\r\n        t._mElement.classList.add('selected');\r\n      else\r\n        t._mElement.classList.remove('selected');\r\n    },\r\n\r\n\r\n    // Create the day (calendar) helper element.\r\n    _dayHelper : function () {\r\n      const table = d.createElement('table');\r\n\r\n      // Localized day view\r\n      const tr = table.addE('thead').addE('tr');\r\n      for (let i = 0; i < 7; i++) {\r\n        tr.addE('th').addT(loc.WDAY[i]);\r\n      };\r\n\r\n      this._dBElement = this._dayBody();\r\n\r\n      table.appendChild(this._dBElement);\r\n      return table;\r\n    },\r\n\r\n\r\n    // Create day body for calendar table\r\n    _dayBody : function () {\r\n      const showDate = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const date = new Date(\r\n        this._showYear,\r\n        this._showMonth - 1,\r\n        1,\r\n        0,\r\n        0,\r\n        0,\r\n        0\r\n      );\r\n      const today = new Date();\r\n      const that = this;\r\n\r\n      // What happens, in case someone clicks\r\n      // on a date\r\n      const click = function () {\r\n        that.set(\r\n          that._showYear,\r\n          that._showMonth,\r\n          parseInt(this.firstChild.data)\r\n        );\r\n      };\r\n\r\n      // Skip back to the previous monday (may be in the last month)\r\n      date.setDate(date.getDate() - ((date.getDay() + 6) % 7));\r\n\r\n      const tb = d.createElement('tbody');\r\n\r\n      const s = this.select();\r\n      \r\n      let tr, i, td;\r\n\r\n      // Iterate over all days of the table\r\n      while (1) {\r\n\r\n        // Loop through the week\r\n        tr = tb.addE('tr');\r\n        for (i = 0; i < 7; i++) {\r\n          td = tr.addE('td');\r\n          \r\n          // Not part of the current month\r\n          if (date.getMonth() !== showDate.getMonth()) {\r\n            td.classList.add('out');\r\n          }\r\n          else {\r\n            td.onclick = click;\r\n          };\r\n    \r\n          // This is the current day\r\n          if (date.getDate()     === today.getDate() &&\r\n              date.getMonth()    === today.getMonth() &&\r\n              date.getFullYear() === today.getFullYear()) {\r\n            td.classList.add('today');\r\n          };\r\n\r\n          // This is the day selected\r\n          if (s && s['day']) {\r\n            if (date.getDate()     === s['day'] &&\r\n                date.getMonth()    === s['month']-1 &&\r\n                date.getFullYear() === s['year']) {\r\n              td.classList.add('selected');\r\n            };\r\n          };\r\n          \r\n          // Add the current day to the table\r\n          td.addT(date.getDate());\r\n    \r\n          // Next day\r\n          date.setDate(date.getDate() + 1);\r\n        };\r\n        \r\n        if (date.getMonth() !== showDate.getMonth())\r\n          break;\r\n      };\r\n      return tb;\r\n    },\r\n\r\n    // Update the calendar view\r\n    _updateDay : function () {\r\n      const newBody = this._dayBody();\r\n      this._dBElement.parentNode.replaceChild(\r\n        newBody,\r\n        this._dBElement\r\n      );\r\n      this._dBElement = newBody;\r\n    },\r\n\r\n\r\n    /**\r\n     * Parse date from string.\r\n     */\r\n    fromString : function (v) {\r\n      if (v === undefined)\r\n        return false;\r\n\r\n      if (!KorAP._validDateRE.test(v))\r\n        return false;\r\n\r\n      const d = v.split('-', 3);\r\n      d[0] = parseInt(d[0]);\r\n      if (d[1]) d[1] = parseInt(d[1]);\r\n      if (d[2]) d[2] = parseInt(d[2]);\r\n\r\n      // Select values\r\n      this.select(d[0], d[1], d[2]);\r\n      return true;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a panel for a certain aspect of the system, like\r\n * the result, a match, or the VC.\r\n *\r\n * The buttons are associated with the panel's views,\r\n * though they are integrated independently\r\n */\r\n\r\n\r\ndefine('panel',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      const t = this;\r\n      t.views = [];\r\n\r\n      /**\r\n       * Main action buttons for the panel,\r\n       * may be at the bottom (for matches)\r\n       * or as tabs (for the result).\r\n       */\r\n\r\n      t._classes = classes;\r\n      const c = ['action', 'button-panel'];\r\n\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n\r\n      t.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      //prepend or append views of the panel\r\n      t.prepend = false;\r\n      \r\n      // Warning: This is circular\r\n      t.actions.panel = t;\r\n      return t;\r\n    },\r\n\r\n    \r\n    /**\r\n     * The element of the panel\r\n     */\r\n    element : function () {\r\n      if (this._el)\r\n        return this._el;\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n      cl.add('panel');\r\n   \r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      this._viewE = e.addE('div');\r\n\r\n      // Per default the action buttons are below the view\r\n      // and integrated\r\n      const aElem = this.actions.element();\r\n      if (!aElem.parentNode)\r\n        e.appendChild(aElem);\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /*\r\n     * The element of the views\r\n     */\r\n    _viewElement : function () {\r\n      this.element();\r\n      return this._viewE;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add a view to the panel\r\n     */\r\n    add : function (view) {\r\n\r\n      // Add view to views list\r\n      this.views.push(view);\r\n\r\n      // Append or prepend element to panel element\r\n      if (this.prepend){\r\n        this._viewElement().prepend(\r\n          view.element()\r\n        );\r\n      }\r\n      else{\r\n        this._viewElement().appendChild(\r\n          view.element()\r\n        );\r\n      }\r\n      \r\n      if (view.afterEmbed)\r\n        view.afterEmbed();\r\n      \r\n      view.panel = this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Delete a closed view from panel\r\n     */\r\n    delView : function (view) {\r\n      this.views.forEach(function(e, i, a) {\r\n        if (e === view)\r\n          a[i] = undefined;\r\n      });\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a view that can be added to a panel,\r\n * like a tree view or the metadata view.\r\n */\r\n\r\n\r\n\r\ndefine('view',['buttongroup', 'util'], function (buttonGroupClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE     || 'Close';  \r\n\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(this)._init(classes);\r\n    },\r\n\r\n    // Override by inheriting object\r\n    _init : function (classes) {\r\n      this.panel = undefined;\r\n      this._classes = classes;\r\n      this._shown = false;\r\n\r\n      // The buttonclass is bind to the view\r\n      const c = ['action', 'button-view'];\r\n      if (classes)\r\n        c.push.apply(c,classes);\r\n      \r\n      this.actions = buttonGroupClass.create(c).bind(this);\r\n\r\n      this.actions.add(loc.CLOSE, {'cls':['button-icon','close']}, function (e) {\r\n        this.close();\r\n      });\r\n\r\n      // Warning: This is circular\r\n      this.actions.view = this;\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Element of the view\r\n     */\r\n    element : function () {\r\n      if (this._el) {\r\n        this._el.classList.add('show');\r\n        return this._el;\r\n      };\r\n\r\n      // Create panel element\r\n      const e = document.createElement('div');\r\n      const cl = e.classList;\r\n\r\n      cl.add('view', 'show');\r\n      if (this._classes)\r\n        cl.add.apply(cl, this._classes);\r\n\r\n      // TODO: The show may need to be wrapped in another DIV!\r\n      if (this.show !== undefined) {\r\n        const s = this.show();\r\n        if (s) {\r\n          e.appendChild(s);\r\n        } else {\r\n          return e\r\n        };\r\n      }\r\n\r\n      this._shown = true;\r\n\r\n      e.appendChild(this.actions.element());\r\n\r\n      return this._el = e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Is the object shown?\r\n     */\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Hide the widget if shown.\r\n     */\r\n    minimize : function () {\r\n      if (this._el) {\r\n        this._el.classList.remove(\"show\");\r\n      }\r\n    },\r\n\r\n\r\n    // onClose : function () {},\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    close : function () {\r\n\r\n      // Close embedded things before\r\n      if (this.onClose)\r\n        this.onClose();\r\n\r\n      const e = this.element();\r\n      if (e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this.panel.delView(this);\r\n      this._shown = false;\r\n    },\r\n\r\n\r\n    /**\r\n     * Upgrade this object to another object,\r\n     * while private data stays intact.\r\n     *\r\n     * @param {Object] An object with properties.\r\n     */\r\n    upgradeTo : function (props) {\r\n      for (let prop in props) {\r\n        this[prop] = props[prop];\r\n      };\r\n      return this;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * View: corpus statistic view\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('view/vc/corpstatv',['view', 'vc/statistic', 'buttongroup'],\r\n       function (viewClass, statClass, buttonGroup) {\r\n\r\n         // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.REFRESH = loc.REFRESH || 'Refresh';\r\n\r\n  return {\r\n    create : function(vc, panel) {\r\n      return Object.create(viewClass).\r\n        _init([ 'vcstatistic' ]).\r\n        upgradeTo(this).\r\n        _init(vc, panel);\r\n    },\r\n\r\n    _init : function(vc, panel) {\r\n      this.vc = vc;\r\n      this.panel = panel;\r\n      return this;\r\n    },\r\n\r\n    /*\r\n     * Returns corpus of the view,\r\n     * vc is used to create the corpus query string \r\n     * which is needed to receive the corpus statistic from the server \r\n     * (see also getStatistic : function(cb) {...))\r\n     */\r\n    getvc : function() {\r\n      return this.vc;\r\n    },\r\n\r\n\r\n    /**\r\n     * Receive Corpus statistic from the server\r\n     */\r\n    getStatistic : function (cb) {\r\n      const vc = this.vc;\r\n\r\n      try {\r\n        KorAP.API.getCorpStat(vc.toQuery(), function(statResponse) {\r\n          if (statResponse === null) {\r\n            cb(null);\r\n            return;\r\n          }\r\n          if (statResponse === undefined) {\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          // catches notifications\r\n          if (statResponse[\"notifications\"] !== null\r\n              && statResponse[\"notifications\"] !== undefined) {\r\n            const notif = statResponse[\"notifications\"];\r\n            KorAP.log(0, notif[0][1]);\r\n            cb(null);\r\n            return;\r\n          }\r\n\r\n          cb(statResponse);\r\n        });\r\n      }\r\n\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      }\r\n\r\n    },\r\n\r\n    /** \r\n     * Show corpus statistic view \r\n     */\r\n    show : function() {\r\n      \r\n      if (this._show)\r\n        return this._show; \r\n      \r\n      const statTable = document.createElement('div');\r\n      statTable.classList.add('stattable', 'loading');\r\n  \r\n      /*\r\n       * Get corpus statistic, remove \"loading\"-image and\r\n       * append result to statTable\r\n       */\r\n      this.getStatistic(function(statistic) {\r\n        statTable.classList.remove('loading');\r\n\r\n        if (statistic === null)\r\n          return;\r\n\r\n        statTable.appendChild(\r\n          statClass.create(statistic).element()\r\n        );\r\n      });\r\n\r\n      return this._show = statTable;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Checks if statistic has to be disabled\r\n     */\r\n    checkStatActive : function () {\r\n      let newString = KorAP.vc.toQuery();\r\n      const oldString = this.vc.oldvcQuery;\r\n      /*\r\n       * Do ignore surrounding round brackets\r\n       * Definining an incomplete docGroup in the vc builder: \r\n       * (foo = bar and author = Goethe) and ... \r\n       * leads to \r\n       * vc.toQuery() -> (foo = bar and author=Goethe)\r\n       */\r\n  \r\n      if (newString || newString === '') {\r\n        if (newString.startsWith('(')) {\r\n          newString = newString.slice(1, newString.length-1);\r\n        };\r\n       \r\n        if (newString != oldString) {\r\n          this.disableStat();\r\n        }\r\n      }\r\n    },\r\n   \r\n\r\n    /**\r\n     * Disabling corpus statistic if in vc builder a different vc is choosen.\r\n     * After clicking at the reload-button the up-to-date corpus statistic is displayed.\r\n     */   \r\n    disableStat : function(){\r\n      const statt = this._show;\r\n  \r\n      if (statt.getElementsByClassName('reloadStatB').length == 0) {\r\n        const btg = buttonGroup.create(['reloadStatB', 'button-panel']);\r\n\r\n        btg.add(loc.REFRESH, {'cls':['refresh', 'button-icon']}, function (e) {\r\n          statt.classList.remove('stdisabled');\r\n          this.panel.reloadCorpStat(); \r\n        }.bind(this));\r\n\r\n        statt.appendChild(btg.element());\r\n        statt.classList.add('stdisabled');\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Close the view.\r\n     */\r\n    onClose : function() {\r\n      this.vc = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The vc info panel\r\n * \r\n * The vc info panel displays information about the virtual corpus, \r\n * for example the corpus statistic\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('panel/vc',[\r\n  'panel',\r\n  'view/vc/corpstatv'\r\n], function (panelClass, corpStatVClass) {\r\n  \r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT= loc.SHOW_STAT || 'Statistics';\r\n  loc.VERB_SHOWSTAT = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  \r\n  return {\r\n    create : function (vc) {\r\n      return Object.create(panelClass)._init(['vcinfo']).upgradeTo(this)._init(vc);\r\n    }, \r\n    \r\n    _init : function(vc){\r\n     this.vc = vc;\r\n     const actions = this.actions;\r\n      actions.add(loc.SHOW_STAT, {'cls':['statistic']}, function() {\r\n        this.addCorpStat();\r\n      }.bind(this));\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Add corpus statistic view to panel\r\n     */\r\n    addCorpStat: function(){\r\n      const t = this;\r\n\r\n      //Refreshes corpus statistic\r\n      if (t.statView !== undefined && t.statView.shown()){\r\n        let statt = t.statView.show();\r\n        if (statt.classList.contains('stdisabled')){\r\n          t.reloadCorpStat(); \r\n          statt.classList.remove('stdisabled');\r\n        }\r\n      };\r\n      \r\n      //Add corpus statistic\r\n      if (t.statView === undefined || !t.statView.shown()) {\r\n        t.statView = corpStatVClass.create(t.vc,t);\r\n        t.add(t.statView);\r\n        t.vc.oldvcQuery = KorAP.vc.toQuery();\r\n      };\r\n    },\r\n    \r\n    /**\r\n     * Reload corpus statistic \r\n     *\r\n     */\r\n    reloadCorpStat: function(){\r\n      this.statView.close();\r\n      this.addCorpStat();\r\n    }    \r\n  }\r\n});\r\n\n/**\r\n * Create virtual corpora with a visual user interface. This resembles the\r\n * corpus/collection type objects of a KoralQuery \"collection\"/\"corpus\" object.\r\n * \r\n * KoralQuery v0.3 is expected.\r\n * \r\n * @author Nils Diewald\r\n */\r\n/*\r\n * This replaces a previous version written by Mengfei Zhou\r\n */\r\n\r\n/*\r\n  TODO: Disable \"and\" or \"or\" in case it's followed \r\n        by an unspecified document\r\n  TODO: Add \"and\"-method to root to add further constraints \r\n        based on match-input (like clicking on a pubDate timestamp in a match) \r\n  TODO: Implement \"persistence\"-Option, injecting the current creation \r\n        date stamp \r\n  TODO: Implement vec-Type for document-id vectors like docID in [1,2,3,4 ...]\r\n\r\n  Error codes: \r\n  701: \"JSON-LD group has no @type attribute\" \r\n  704: \"Operation needs operand list\" \r\n  802: \"Match type is not supported by value type\" \r\n  804: \"Unknown value type\" \r\n  805: \"Value is invalid\" \r\n  806: \"Value is not a valid date string\" \r\n  807: \"Value is not a valid regular expression\" \r\n  810: \"Unknown document group operation\" (like 711) \r\n  811: \"Document group expects operation\" (like 703) \r\n  812: \"Operand not supported in document group\" (like 744) \r\n  813: \"Collection type is not supported\" (like 713) \r\n  814: \"Unknown rewrite operation\" \r\n  815: \"Rewrite expects source\"\r\n  \r\n  Localization strings: \r\n  KorAP.Locale = {\r\n    EMPTY : '...', \r\n    AND : 'and', \r\n    OR : 'or',\r\n   DELETE : 'x' }\r\n   \r\n   and various field names with the prefix 'VC_'\r\n */\r\n\r\n\r\ndefine('vc',[\r\n  'vc/unspecified',\r\n  'vc/doc',\r\n  'vc/docgroup',\r\n  'vc/docgroupref',\r\n  'vc/menu',\r\n  'vc/statistic',\r\n  'datepicker',\r\n  'buttongroup',\r\n  'panel/vc',\r\n  'view/vc/corpstatv',\r\n  'buttongroup',\r\n  'util'\r\n], function(\r\n  unspecDocClass,\r\n  docClass,\r\n  docGroupClass,\r\n  docGroupRefClass,\r\n  menuClass,\r\n  statClass,\r\n  dpClass,\r\n  buttonGrClass,\r\n  vcPanelClass,\r\n  corpStatVClass,\r\n  buttonGroupClass) {\r\n\r\n  KorAP._validUnspecMatchRE = new RegExp(\r\n    \"^(?:eq|ne|contains(?:not)?|excludes)$\");\r\n  KorAP._validStringMatchRE = new RegExp(\"^(?:eq|ne)$\");\r\n  KorAP._validTextMatchRE = KorAP._validUnspecMatchRE;\r\n  KorAP._validTextOnlyMatchRE = new RegExp(\r\n    \"^(?:contains(?:not)?|excludes)$\");\r\n  KorAP._overrideStyles = false;\r\n  // KorAP._validDateMatchRE is defined in datepicker.js!\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.SHOW_STAT        = loc.SHOW_STAT        || 'Statistics';\r\n  loc.VERB_SHOWSTAT    = loc.VERB_SHOWSTAT    || 'Corpus Statistics';\r\n  loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';\r\n  loc.VC_oneCollection = loc.VC_oneCollection || 'a virtual corpus';\r\n  loc.MINIMIZE         = loc.MINIMIZE         || 'Minimize';\r\n\r\n  KorAP._vcKeyMenu = undefined;\r\n  KorAP._vcDatePicker = dpClass.create();\r\n\r\n  // Create match menus ....\r\n  KorAP._vcMatchopMenu = {\r\n    'string' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ]),\r\n    'text' : menuClass.create([\r\n      [ 'eq', null ], // Requires exact match\r\n      [ 'ne', null ],\r\n      [ 'contains', null ], // Requires token sequence match\r\n      [ 'containsnot', null ]\r\n    ]),\r\n    'date' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ],\r\n      [ 'geq', null ],\r\n      [ 'leq', null ]\r\n    ]),\r\n    'regex' : menuClass.create([\r\n      [ 'eq', null ],\r\n      [ 'ne', null ]\r\n    ])\r\n  };\r\n\r\n\r\n  /**\r\n   * Virtual corpus\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * The JSON-LD type of the virtual corpus\r\n     */\r\n    ldType : function() {\r\n      return null;\r\n    },\r\n\r\n\r\n    // Initialize virtual corpus\r\n    _init : function(keyList) {\r\n\r\n      // Inject localized css styles\r\n      if (!KorAP._overrideStyles) {\r\n\r\n        const sheet = KorAP.newStyleSheet();\r\n\r\n        // Add css rule for OR operations\r\n        sheet.insertRule('.vc .docGroup[data-operation=or] > .doc::before,'\r\n                         + '.vc .docGroup[data-operation=or] > .docGroup::before '\r\n                         + '{ content: \"' + loc.OR + '\" }', 0);\r\n\r\n        // Add css rule for AND operations\r\n        sheet.insertRule(\r\n          '.vc .docGroup[data-operation=and] > .doc::before,'\r\n            + '.vc .docGroup[data-operation=and] > .docGroup::before '\r\n            + '{ content: \"' + loc.AND + '\" }', 1);\r\n\r\n        KorAP._overrideStyles = true;\r\n      };\r\n\r\n      let l;\r\n      if (keyList) {\r\n        l = keyList.slice();\r\n        l.unshift(['referTo', 'ref']);\r\n      }\r\n      else {\r\n        l = [['referTo', 'ref']];\r\n      }\r\n      \r\n      // Create key menu\r\n      KorAP._vcKeyMenu = menuClass.create(l);\r\n      KorAP._vcKeyMenu.limit(6);\r\n\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create a new virtual corpus\r\n     */\r\n    create : function (keyList) {\r\n      const obj = Object.create(this)._init(keyList);\r\n      obj._root = unspecDocClass.create(obj);\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create and render a new virtual corpus based on a KoralQuery\r\n     * corpus document\r\n     */\r\n    fromJson : function(json) {\r\n\r\n      let obj;\r\n      \r\n      if (json !== undefined) {\r\n\r\n        // Parse root document\r\n        if (json['@type'] == 'koral:doc') {\r\n          obj = docClass.create(this, json);\r\n        }\r\n\r\n        // parse root group\r\n        else if (json['@type'] == 'koral:docGroup') {\r\n          obj = docGroupClass.create(this, json);\r\n        }\r\n\r\n        // parse root reference\r\n        else if (json['@type'] == 'koral:docGroupRef') {\r\n          obj = docGroupRefClass.create(this, json);\r\n        }\r\n        \r\n        // Unknown collection type\r\n        else {\r\n          KorAP.log(813, \"Collection type is not supported\");\r\n          return;\r\n        };\r\n      }\r\n\r\n      else {\r\n        // Add unspecified object\r\n        obj = unspecDocClass.create(this);\r\n      };\r\n\r\n      // Init element and update\r\n      this.root(obj);   \r\n \r\n      return this;\r\n    },\r\n\r\n\r\n    // Check if the virtual corpus contains a rerite\r\n    wasRewritten : function (obj) {\r\n\r\n      if (arguments.length !== 1) {\r\n        obj = this._root;\r\n      };\r\n\r\n      // Check for rewrite\r\n      if (obj.rewrites() && obj.rewrites().length() > 0) {\r\n        return true;\r\n      }\r\n\r\n      // Check recursively\r\n      else if (obj.ldType() === 'docGroup') {\r\n\r\n        // If there was a rewritten object\r\n        if (obj.operands().find(op => this.wasRewritten(op)) !== undefined) {\r\n          return true;\r\n        };\r\n      };\r\n      \r\n      return false;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Clean the virtual document to unspecified doc.\r\n     */\r\n    clean : function() {\r\n      const t = this;\r\n      if (t._root.ldType() !== \"non\") {\r\n        t._root.destroy();\r\n        t.root(unspecDocClass.create(t));\r\n      };\r\n\r\n      // update for graying corpus statistic by deleting the first line of the vc builder\r\n      t.update();\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get or set the root object of the virtual corpus\r\n     */\r\n    root : function(obj) {\r\n      if (arguments.length === 1) {\r\n        const e = this.builder();\r\n        \r\n        if (e.firstChild !== null) {\r\n\r\n          // Object not yet set\r\n          if (e.firstChild !== obj.element()) {\r\n            e.replaceChild(obj.element(), e.firstChild);\r\n          };\r\n        }\r\n\r\n        // Append root element\r\n        else {\r\n          e.appendChild(obj.element());\r\n        };\r\n\r\n        // Update parent child relations\r\n        this._root = obj;\r\n        obj.parent(this);\r\n\r\n        this.update();\r\n      };\r\n\r\n      return this._root;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the wrapper element associated with the vc\r\n     */\r\n    builder : function () {\r\n      const t = this;\r\n\r\n      // Initialize if necessary\r\n      if (t._builder !== undefined)\r\n        return t._builder;\r\n\r\n      t.element();\r\n      return t._builder;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function() {\r\n      const t = this;\r\n      let e = t._el;\r\n\r\n      if (e !== undefined)\r\n        return e;\r\n\r\n\r\n      e = t._el = document.createElement('div');\r\n      e.classList.add('vc');\r\n\r\n\r\n      t._builder = e.addE('div');\r\n      t._builder.setAttribute('class', 'builder');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        this.minimize();\r\n      }.bind(t));\r\n\r\n      e.appendChild(btn.element());\r\n      \r\n      // Initialize root\r\n      t._builder.appendChild(t._root.element());      \r\n      \r\n      // Add panel to display corpus statistic, ...\r\n      t.addVcInfPanel();\r\n      \r\n      //Adds EventListener for corpus changes\r\n      t._el.addEventListener('vcChange', function (e) {\r\n        this.checkStatActive(e.detail);\r\n      }.bind(t), false);\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the VC is open\r\n     */\r\n    isOpen : function () {\r\n      if (!this._el)\r\n        return false;\r\n      return this._el.classList.contains('active');\r\n    },\r\n    \r\n\r\n    /**\r\n     * Open the VC view\r\n     */\r\n    open : function () {\r\n      this.element().classList.add('active');\r\n      if (this.onOpen)\r\n        this.onOpen();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize the VC view\r\n     */\r\n    minimize : function () {\r\n      this.element().classList.remove('active');\r\n      if (this.onMinimize)\r\n        this.onMinimize();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */    \r\n    update : function() {\r\n      this._root.update();\r\n      if (KorAP.vc) {\r\n        this.element().dispatchEvent(\r\n          new CustomEvent('vcChange', {'detail':this})\r\n        );\r\n      };\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Make the vc persistant by injecting the current timestamp as a\r\n     * creation date limit criterion.\r\n     * THIS IS CURRENTLY NOT USED\r\n     */\r\n    /*\r\n    makePersistant : function() {\r\n      // this.root().wrapOnRoot('and');\r\n      var todayStr = KorAP._vcDatePicker.today();\r\n      var doc = docClass.create();\r\n      var root = this.root();\r\n\r\n      if (root.ldType() === 'docGroup' && root.operation === 'and') {\r\n        root.append(cond);\r\n      } else {\r\n        root.wrapOnRoot('and');\r\n        root.append(doc);\r\n      };\r\n\r\n      doc.key(\"creationDate\");\r\n      doc.type(\"date\");\r\n      doc.matchop(\"leq\");\r\n      doc.value(todayStr);\r\n\r\n      // { \"@type\" : \"koral:doc\", \"key\" : \"creationDate\", \"type\" :\r\n      // \"type:date\", \"match\" : \"match:leq\", \"value\" : todayStr }\r\n      // this.root().append(cond);\r\n      this.update();\r\n    },\r\n    */\r\n\r\n\r\n    // Get the reference name\r\n    getName : function () {\r\n      if (this._root.ldType() === 'non') {\r\n        return loc.VC_allCorpora;\r\n      }\r\n      else if (this._root.ldType() === 'docGroupRef') {\r\n        return this._root.ref();\r\n      }\r\n      else {\r\n        return loc.VC_oneCollection;\r\n      }\r\n    },\r\n\r\n\r\n    // Add \"and\" constraint to VC\r\n    addRequired : function (doc) {\r\n      const root = this.root();\r\n      const ldType = root.ldType();\r\n      const parent = root.parent();\r\n\r\n      if (ldType === 'non') {\r\n        parent.root(doc);\r\n      }\r\n\r\n      // root is doc\r\n      else if (\r\n        ldType === 'doc' ||\r\n          ldType === 'docGroupRef' ||\r\n          (ldType === 'docGroup' &&\r\n           root.operation() === 'or'\r\n          )) {\r\n        const group = require('vc/docgroup').create(\r\n          parent\r\n        );\r\n        group.operation(\"and\");\r\n        group.append(root);\r\n        group.append(doc);\r\n        group.element(); // Init (seems to be necessary)\r\n        parent.root(group);\r\n      }\r\n      \r\n      // root is a docGroup\r\n      // and is already an 'and'-Group\r\n      else if (ldType === 'docGroup') {\r\n        root.append(doc);\r\n      }\r\n\r\n      // Unknown\r\n      else {\r\n        console.log(\"Unknown root object\");\r\n      };\r\n\r\n      // Init element and update\r\n      this.update();\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the generated json string\r\n     */\r\n    toJson : function () {\r\n      return this._root.toJson();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the generated query string\r\n     */\r\n    toQuery : function () {\r\n      return this._root.toQuery();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add panel to display virtual corpus information\r\n     */\r\n    addVcInfPanel : function () {\r\n      // Create panel  \r\n      this.panel = vcPanelClass.create(this); \r\n      this._el.addE('div').appendChild(this.panel.element());\r\n      \r\n    },\r\n    \r\n    /**\r\n     * Checks if corpus statistic has to be disabled,\r\n     * and to be updated after clicking at the \"reload-button\"\r\n     */\r\n    checkStatActive : function (){\r\n      if (this.panel !== undefined && this.panel.statView !== undefined){\r\n        this.panel.statView.checkStatActive();\r\n      };\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Corpus specific localization, here for DeReKo (http://www1.ids-mannheim.de/kl/projekte/korpora.html)\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\n\r\ndefine('loc/dereko',['vc', 'vc/doc'], function (vcClass, docClass) {\r\n  const loc = KorAP.Locale;\r\n  \r\n  //Query example for guided tour\r\n  loc.TOUR_Qexample = \"laufen\";\r\n\r\n  /* To define vc for guided tour */\r\n  loc.TOUR_vcQuery = {\r\n      '@type' : 'koral:doc',\r\n      'key' : 'docSigle', \r\n      'match': 'match:eq',\r\n      'value' : 'WPD17/D01',   \r\n    };\r\n  \r\n  loc.TOUR_Relations = \"corenlp/c\";\r\n\r\n});\r\n\n\r\n\r\ndefine('match/treeitem',['menu/item'], function (itemClass) {\r\n\r\n  /**\r\n   * Menu item for tree view choice.\r\n   */\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the\r\n     * menu item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n    \r\n\r\n    /**\r\n     * The foundry attribute of the menu item.\r\n     */\r\n    foundry : function () {\r\n      return this._foundry;\r\n    },\r\n\r\n\r\n    /**\r\n     * The layer attribute of the menu item.\r\n     */\r\n    layer : function () {\r\n      return this._layer;\r\n    },\r\n\r\n\r\n    /**\r\n     * The type attribute of the menu item.\r\n     * Is either \"spans\" or \"rels\".\r\n     */\r\n    type : function () {\r\n      return this._type;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      const menu = this.menu();\r\n      menu.hide();\r\n      e.halt();\r\n\r\n      if (menu.panel() !== undefined) {\r\n\t      menu.panel().addTree(this._foundry, this._layer, this._type);\r\n      };\r\n    },\r\n\r\n\r\n    // Initialize tree menu item.\r\n    _init : function (params) {\r\n      if (params[0] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n\r\n      t._name    = params[0];\r\n      t._foundry = params[1];\r\n      t._layer   = params[2];\r\n      t._type    = params[3];\r\n      t._content = document.createTextNode(t._name);\r\n      t._lcField = ' ' + t.content().textContent.toLowerCase();\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * QueryCreator for Kalamar.\r\n * This creates a Poliqarp/CQP query by using the\r\n * annotation table.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/querycreator',['util'], function () {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Cache foundry and layer information per row.\r\n   * TODO:\r\n   *   Or-Groups are no longer in use.\r\n   * TODO:\r\n   *   Make language and input fields snigletons!\r\n   */\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_QUERY = loc.NEW_QUERY || 'New Query';\r\n\r\n  const esc = RegExp(\"[ \\.\\'\\\\\\\\\\|\\&]\");\r\n  \r\n  function _getKeyValue (keyValue) {\r\n    if (keyValue.match(esc) != null) {\r\n      return \"'\" + keyValue.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\") + \"'\";\r\n    };\r\n    return keyValue;\r\n  };\r\n  \r\n  function _getAnnotation (prefix, target) {\r\n\r\n    // Complex annotation\r\n    if (target.childNodes.length > 1) {\r\n      let orGroup = [];\r\n\r\n      // Iterate over alternative annotations\r\n      target.childNodes.forEach(function (item) {\r\n        if (item.nodeType === 3)\r\n          orGroup.push(prefix + _getKeyValue(item.data));\r\n      });\r\n      return '(' + orGroup.sort().join(' | ') + ')';\r\n    }\r\n\r\n    // Simple annotation\r\n    else {\r\n      if (target.innerText == '')\r\n        return '';\r\n\r\n      return prefix + _getKeyValue(target.innerText);\r\n    };\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (matchTable) {\r\n      return Object.create(this)._init(matchTable);\r\n    },\r\n\r\n    // Initialize query creator\r\n    _init : function (matchTable) {\r\n\r\n      // Parameter checks\r\n      if (matchTable === undefined)\r\n        throw new Error('Missing parameters');\r\n      else if (!(matchTable instanceof Node))\r\n        throw new Error('Requires element');\r\n\r\n      const t = this;\r\n\r\n      // Collect the token sequence in an array\r\n      t._query = []\r\n\r\n      // Get the match table\r\n      t._matchTable = matchTable;\r\n\r\n      // Listen on the match table\r\n      t._matchTable.addEventListener(\r\n        \"click\", t.clickOnAnno.bind(t), false\r\n      );\r\n\r\n      // Initialize element\r\n      const e = t._el = document.createElement('p');\r\n      e.classList.add('query','fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_QUERY + ':');\r\n\r\n      // Append query fragment part\r\n      t._queryFragment = e.addE('span');\r\n\r\n      // Event when the query fragment is clicked\r\n      e.addEventListener('click', t.toQueryBar.bind(t), 1);\r\n\r\n      // Get some basic information - see tutorial.js\r\n      // TODO:\r\n      //   It may be better to consultate a global object\r\n      //   like KorAP.Hint, however ...\r\n      t._ql = document.getElementById(\"ql-field\");\r\n\t    t._q = document.getElementById(\"q-field\")\r\n\r\n      t._shown = false;\r\n      return t;\r\n    },\r\n\r\n\r\n    // Realease a click event on the annotation table\r\n    clickOnAnno : function (event) {\r\n      \r\n      // Listen for clicks on table cells\r\n      if (event.target !== event.currentTarget) {\r\n\r\n        // Get target event\r\n        const target = event.target;\r\n\r\n        let head, foundry, layer, i, sib, annotation;\r\n\r\n        if (target.tagName == 'TD') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.classList.contains('matchkeyvalues'))\r\n            return;\r\n\r\n\r\n          // Check foundry and layer\r\n          head    = target.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position:\r\n          i = -2;\r\n          sib = target;\r\n          while ((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          };\r\n        }\r\n\r\n        // The annotation is part of a key-value-pair\r\n        else if (target.tagName == 'SPAN' || target.tagName == 'DIV') {\r\n\r\n          if (target.innerText == '')\r\n            return;\r\n\r\n          if (target.tagName == 'SPAN') {\r\n            target = target.parentNode;\r\n          };\r\n\r\n          // Check foundry and layer\r\n          const parentCell = target.parentNode;\r\n          head    = parentCell.parentNode.getElementsByTagName('th');\r\n          foundry = head[0].innerText;\r\n          layer   = head[1].innerText;\r\n\r\n          // Check index position of parent cell\r\n          i = -2;\r\n          sib = parentCell;\r\n          while((sib = sib.previousSibling) != null) {\r\n            if (sib.nodeType === 1)\r\n              i++;\r\n          };\r\n\r\n          // Get annotation value from cell\r\n          annotation = _getAnnotation(foundry + '/' + layer + '=', target);\r\n\r\n          if (annotation !== '') {\r\n\r\n            // Add term\r\n            this.toggleInToken(target, i, annotation);\r\n          }\r\n        }\r\n\r\n        // Get orth values\r\n        else if (target.tagName == 'TH') {\r\n\r\n          // The head is in the top row\r\n          if (target.parentNode.parentNode.tagName == 'THEAD') {\r\n\r\n            // Ignore cutted field\r\n            if (target.classList.contains(\"cutted\")) {\r\n              return;\r\n            }\r\n\r\n            i = -2;\r\n            sib = target;\r\n            while ((sib = sib.previousSibling) != null) {\r\n              if (sib.nodeType === 1)\r\n                i++;\r\n            };\r\n\r\n            // Target is an orth\r\n            if (i >= 0) {\r\n              this.toggleInToken(target, i, _getAnnotation(\"orth=\",target));\r\n            }            \r\n          }\r\n\r\n          // The head refers to the complete row\r\n          // Mark the complete row!\r\n          else {\r\n\r\n            // Check foundry and layer\r\n            head    = target.parentNode.getElementsByTagName('th');\r\n            foundry = head[0].innerText;\r\n            layer   = head[1].innerText;\r\n            const prefix = foundry + '/' + layer + '=';\r\n\r\n            // Iterate over all siblings\r\n            i = 0;\r\n            sib = target;\r\n            while ((sib = sib.nextSibling) != null) {\r\n              if (sib.nodeType !== 1 || sib.tagName === 'TH')\r\n                continue;\r\n\r\n              // Is a key-value-cell\r\n              if (sib.classList.contains('matchkeyvalues')) {\r\n\r\n                Array.from(\r\n                  sib.getElementsByTagName('div')\r\n                ).forEach(function(keyvaluepair){\r\n\r\n                  // Get annotation value from cell\r\n                  annotation = _getAnnotation(prefix, keyvaluepair);\r\n\r\n                  if (annotation !== '') {\r\n\r\n                    // Add annotation to string\r\n                    this._addToToken(i, annotation);\r\n                    keyvaluepair.classList.add('chosen');\r\n                  };\r\n                }, this);\r\n              }\r\n\r\n              // Normal cell\r\n              else {\r\n\r\n                // Get annotation value from cell\r\n                annotation = _getAnnotation(prefix, sib);\r\n\r\n                if (annotation !== '') {\r\n\r\n                  // Add annotation to string\r\n                  this._addToToken(i, annotation);\r\n                  sib.classList.add('chosen');\r\n                };\r\n              }\r\n\r\n              i++;\r\n            };\r\n          };\r\n        };\r\n      };\r\n\r\n      event.stopPropagation();\r\n    },\r\n\r\n\r\n    // Add term to token\r\n    _addToToken : function (index, term) {\r\n\r\n      let token = this._query[index];\r\n\r\n      // Initialize token\r\n      if (token === undefined) {\r\n        token = this._query[index] = [];\r\n      };\r\n\r\n      // Push to token array\r\n      token.push(term);\r\n\r\n      // Make terms unique\r\n      this._query[index] = token.filter(\r\n        function (e, i, arr) {\r\n          return arr.lastIndexOf(e) === i;\r\n        }\r\n      );\r\n\r\n      this.show();\r\n    },\r\n\r\n\r\n    // Remove term from token\r\n    _removeFromToken : function (index, term) {\r\n      let token = this._query[index];\r\n\r\n      if (token === undefined)\r\n        return;\r\n\r\n      token.splice(token.indexOf(term), 1);\r\n\r\n      this._query[index] = token.length > 0 ? token : undefined;\r\n      \r\n      this.show();\r\n    },\r\n\r\n    \r\n    // Get element representing annotation line\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Check if the query fragment is shown\r\n    shown : function () {\r\n      return this._shown;\r\n    },\r\n\r\n    \r\n    // Show annotation fragment\r\n    show : function () {\r\n\r\n      const t = this;\r\n      const str = t.toString();\r\n      const m = t._matchTable;\r\n\r\n      // Fragment is empty\r\n      if (str === '') {\r\n\r\n        // Hide element\r\n        if (t._shown === true) {\r\n          m.parentNode.removeChild(t._el);\r\n          t._shown = false;\r\n        }\r\n      }\r\n\r\n      // Fragment is defined\r\n      else {\r\n\r\n        if (t._shown === false) {\r\n\r\n          // Insert after\r\n          m.parentNode.insertBefore(\r\n            t._el, m.nextSibling\r\n          );\r\n          t._shown = true;\r\n        };\r\n\r\n        // set value\r\n        t._queryFragment.innerText = str;\r\n      };\r\n    },\r\n\r\n\r\n    // Add term to token if not yet chosen, otherwise remove\r\n    toggleInToken : function (node, index, term) {\r\n      const cl = node.classList;\r\n      if (cl.contains('chosen')) {\r\n        this._removeFromToken(index, term);\r\n        cl.remove('chosen');\r\n      }\r\n      else {\r\n        this._addToToken(index, term);\r\n        cl.add('chosen');\r\n      };\r\n    },\r\n\r\n\r\n    // Stringify annotation\r\n    toString : function () {\r\n      let str = '';\r\n      let distance = 0;\r\n\r\n      // This needs to take undefined tokens into account, therefore\r\n      // forEach() is not an option\r\n      let token;\r\n      for (let i = 0; i < this._query.length; i++) {\r\n        token = this._query[i];\r\n\r\n        // Token is defined\r\n        if (token !== undefined) {\r\n          if (distance > 0) {\r\n            str += '[]';\r\n            if (distance > 1) {\r\n              str += '{' + distance + '}';\r\n            };\r\n            distance = 0;\r\n          };\r\n          \r\n          str += '[' + token.sort().join(\" & \") + ']';\r\n        }\r\n\r\n        // Token is not defined - but distances count\r\n        else if (str !== '') {\r\n          distance++;\r\n        };\r\n      };\r\n\r\n      return str;\r\n    },\r\n\r\n\r\n    // Add query fragment to query bar\r\n    toQueryBar : function (e) {\r\n      const t = this;\r\n\r\n      if (t._ql === undefined || t._q === undefined || t._ql === null) {\r\n        console.log('No query language object defined');\r\n        return;\r\n      };\r\n\r\n      // Find query language field for Poliqarp\r\n      const ql = Array.from(\r\n        t._ql.options\r\n      ).find(e => e.value == 'poliqarp');\r\n\r\n      if (ql)\r\n        ql.selected = true;\r\n\r\n      // Insert to query bar\r\n      t._q.value = t.toString();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    }\r\n  };  \r\n});\r\n\n/**\r\n * Table representation of token-based\r\n * annotations of a match.\r\n */\r\n\r\n\r\ndefine('match/table',[\r\n  'match/querycreator',\r\n  \"util\"\r\n], function (matchQueryCreator) {\r\n\r\n  /*\r\n   * TODO:\r\n   *   Create base object for all matchinfo classes!\r\n   * TODO:\r\n   *   Rename to match/annotationtable\r\n   */\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new table view for a match\r\n     * based on a snippet string.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize table based on snippet\r\n    _init : function (snippet) {\r\n\r\n      // Create html for traversal\r\n      const html = d.createElement(\"div\");\r\n      const t = this;\r\n      html.innerHTML = snippet;\r\n      \r\n      t._pos     = 0;\r\n      t._token   = [];\r\n      t._mark    = [];\r\n      t._markE   = undefined;\r\n      t._cutted  = [];\r\n      t._info    = [];\r\n      t._foundry = {};\r\n      t._layer   = {};\r\n    \r\n      // Parse the snippet\r\n      t._parse(html.childNodes, false);      \r\n\r\n      html.innerHTML = '';\r\n      return t;\r\n    },\r\n\r\n\r\n    // TODO: Destroy match!\r\n    destroy : function () {\r\n      this._matchCreator = undefined;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the table (columns),\r\n     * aka the number of tokens\r\n     * in the snippet.\r\n     */\r\n    length : function () {\r\n      return this._pos;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move the viewport to the match\r\n     */\r\n    toMark : function () {\r\n      if (this._markE === undefined)\r\n        return;\r\n      this._markE.scrollIntoView({\r\n        inline: \"start\",\r\n        block: \"nearest\"\r\n      });\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the token in the snippet\r\n     * At a given position.\r\n     *\r\n     * @param pos\r\n     */\r\n    getToken : function (pos) {\r\n      if (pos === undefined)\r\n        return this._token;\r\n      return this._token[pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the annotation of a token\r\n     * in the snippet based on the position,\r\n     * the foundry, and the layer.\r\n     *\r\n     * @param pos\r\n     * @param foundry\r\n     * @param layer\r\n     */\r\n    getValue : function (pos, foundry, layer) {\r\n      return this._info[pos][foundry + '/' + layer]\r\n    },\r\n\r\n\r\n    // Parse the snippet\r\n    _parse : function (children, mark) {\r\n\r\n      // Get all children\r\n      children.forEach(function(c) {\r\n        const t = this;\r\n\r\n        // Create object on position unless it exists\r\n        if (t._info[t._pos] === undefined) {\r\n          t._info[t._pos] = {};\r\n        };\r\n\r\n        // Store at position in foundry/layer as array\r\n        const found = t._info[t._pos];\r\n\r\n        // Element with title\r\n        if (c.nodeType === 1) {\r\n          let newMark = mark;\r\n\r\n          if (c.tagName === 'MARK') {\r\n            newMark = true;\r\n          }\r\n\r\n          else if (c.hasAttribute(\"title\") &&\r\n              _TermRE.exec(c.getAttribute(\"title\"))) {\r\n\r\n            // Fill position with info\r\n            let foundry, layer, value;\r\n            if (RegExp.$2) {\r\n              foundry = RegExp.$1;\r\n              layer   = RegExp.$2;\r\n            }\r\n            else {\r\n              foundry = \"base\";\r\n              layer   = RegExp.$1\r\n            };\r\n\r\n            value = RegExp.$3;\r\n      \r\n            if (found[foundry + \"/\" + layer] === undefined) {\r\n              found[foundry + \"/\" + layer] = [value];\r\n            }\r\n            else {\r\n              // if (found[foundry + \"/\" + layer].indexOf(value) === -1) {\r\n              if (!found[foundry + \"/\" + layer].includes(value)) {\r\n                // Push value to foundry/layer at correct position\r\n                found[foundry + \"/\" + layer].push(value);\r\n              };\r\n            }\r\n\r\n            // Set foundry\r\n            if (t._foundry[foundry] === undefined)\r\n              t._foundry[foundry] = {};\r\n            t._foundry[foundry][layer] = 1;\r\n\r\n            // Set layer\r\n            if (t._layer[layer] === undefined)\r\n              t._layer[layer] = {};\r\n            t._layer[layer][foundry] = 1;\r\n          }\r\n\r\n          // The current position marks a cut\r\n          else if (c.hasAttribute(\"class\") && c.getAttribute(\"class\") == \"cutted\") {\r\n            t._cutted.push(t._pos);\r\n            t._token[t._pos++] = \"\";            \r\n          }\r\n\r\n          // depth search\r\n          if (c.hasChildNodes())\r\n            t._parse(c.childNodes, newMark);\r\n        }\r\n\r\n        // Leaf node\r\n        // store string on position and go to next string\r\n        else if (c.nodeType === 3) {\r\n          if (c.nodeValue.match(/[a-z0-9\\u25ae]/iu)) {\r\n            t._mark[t._pos] = mark ? true : false;\r\n            t._token[t._pos++] = c.nodeValue;\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      delete this._info[this._pos];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get HTML table view of annotations.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // First the legend table\r\n      const wrap = d.createElement('div');\r\n\r\n      const table = wrap.addE('table');\r\n\r\n      this._el = wrap;\r\n\r\n      // Single row in head\r\n      let tr = table.addE('thead').addE('tr');\r\n\r\n      const ah = KorAP.annotationHelper || { \"getDesc\" : function () {}};\r\n      \r\n      // Add cell to row\r\n      const addCell = function (type, key, value) {        \r\n        const c = this.addE(type);\r\n\r\n        if (value === undefined)\r\n          return c;\r\n\r\n        if (key && value instanceof Array && value[1] !== undefined) {\r\n\r\n          // There are multiple values to add\r\n          c.classList.add('matchkeyvalues');\r\n\r\n          let e, anno;\r\n          value.forEach(function(v) {\r\n            e = c.addE('div');\r\n            e.addT(v);\r\n\r\n            anno = ah.getDesc(key, v);\r\n\r\n            if (anno)\r\n              e.setAttribute(\"title\", anno);\r\n          });\r\n        }\r\n\r\n        else {\r\n\r\n          if (value instanceof Array)\r\n            value = value[0];\r\n\r\n          c.addT(value);\r\n\r\n          // Add tooltip\r\n          const anno = ah.getDesc(key, value);\r\n          if (anno)\r\n            c.setAttribute(\"title\", anno);\r\n        };\r\n\r\n        return c;\r\n      };\r\n\r\n      tr.addCell = addCell;\r\n\r\n      // Add header information\r\n      tr.addCell('th', undefined, 'Foundry');\r\n      tr.addCell('th', undefined, 'Layer');\r\n\r\n      // Add tokens\r\n      Object.keys(this._token).forEach(function(i) {\r\n        const surface = this.getToken(i);\r\n        const c = tr.addCell('th', undefined, surface);\r\n        if (this._mark[i]) {\r\n          c.classList.add('mark');\r\n          if (this._markE === undefined) {\r\n            this._markE = c;\r\n          };\r\n        }\r\n        else if (this._cutted[0] == i || this._cutted[1] == i) {\r\n          c.classList.add('cutted');\r\n        };\r\n\r\n        // In case the title is very long - add a title attribute\r\n        if (surface.length > 20) {\r\n          c.setAttribute(\"title\", surface)\r\n        }\r\n      }, this);\r\n      \r\n      const tbody = table.addE('tbody');\r\n\r\n      let layerList, key, v, value, cell;\r\n      \r\n      Object.keys(this._foundry).sort().forEach(function(foundry) {\r\n        let layerList =\r\n            Object.keys(this._foundry[foundry]).sort();\r\n\r\n        layerList.forEach(function(layer) {\r\n\r\n          tr = tbody.addE('tr');\r\n          tr.setAttribute('tabindex', 0);\r\n          tr.addCell = addCell;\r\n          tr.addCell('th', undefined, foundry);\r\n          tr.addCell('th', undefined, layer);\r\n\r\n          key = foundry + '/' + layer + '=';\r\n\r\n          for (v = 0; v < this.length(); v++) {\r\n\r\n            // Get the cell value\r\n            value = this.getValue(v, foundry, layer);\r\n\r\n            // Add cell to row\r\n            cell = tr.addCell(\r\n              'td',\r\n              key,\r\n              value \r\n            );\r\n\r\n            if (this._mark[v]) {\r\n              cell.classList.add('mark');\r\n            };\r\n          };\r\n        }, this);\r\n      }, this);\r\n      \r\n      // Add query creator\r\n      this._matchCreator = matchQueryCreator.create(this._el);\r\n      \r\n      return this._el;\r\n    },\r\n  };\r\n});\r\n\n/**\r\n * Object representing information\r\n * about a match's layer annotation.\r\n */\r\n\r\n\r\ndefine('match/infolayer',[],function () {\r\n\r\n  const _AvailableRE =\r\n    new RegExp(\"^([^\\/]+?)\\/([^=]+?)(?:=(spans|rels|tokens))?$\");\r\n\r\n  return {\r\n    /**\r\n     * Create new match information\r\n     * object for one layer.\r\n     *\r\n     * Alternatively pass a string as\r\n     * <tt>base/s=span</tt>\r\n     *\r\n     * @param foundry\r\n     */\r\n    create : function (foundry, layer, type) {\r\n      return Object.create(this)._init(foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize Layer \r\n    _init : function (foundry, layer, type) {\r\n      if (foundry === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n\r\n      const t = this;\r\n      \r\n      if (layer === undefined) {\r\n\t      if (_AvailableRE.exec(foundry)) {\r\n\t        t.foundry = RegExp.$1;\r\n\t        t.layer = RegExp.$2;\r\n\t        t.type = RegExp.$3;\r\n\t      }\r\n\t      else {\r\n\t        throw new Error(\"Missing parameters\");\r\n\t      };\r\n      }\r\n      else {\r\n\t      t.foundry = foundry;\r\n\t      t.layer = layer;\r\n\t      t.type = type;\r\n      };\r\n      \r\n      if (t.type === undefined)\r\n\t      t.type = 'tokens';\r\n\r\n      return t;\r\n    }\r\n  };\r\n});\r\n\r\n\n\r\n\r\ndefine('view/match/tokentable',[\r\n  'view',\r\n  'match/table',\r\n  'match/infolayer'\r\n], function (viewClass, matchTableClass, infoLayerClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['tokentable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * TokenTable view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      // Append default table\r\n      const matchtable = d.createElement('div');\r\n      matchtable.classList.add('matchtable', 'loading');\r\n      this._show = matchtable;\r\n      return matchtable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n      // TODO:\r\n      //   Create try-catch-exception-handling\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      // var that = this;\r\n      const matchtable = this._show;\r\n\r\n      // Create the table asynchronous\r\n      this.getData(undefined, function (table) {\r\n\r\n        if (table !== null) {\r\n          matchtable.appendChild(table.element());\r\n          table.toMark();\r\n\t      };\r\n      });\r\n\r\n      // Load data\r\n      matchtable.classList.remove('loading');      \r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (tokens, cb) {\r\n      let focus = [];\r\n\r\n      // Get all tokens\r\n      if (tokens === undefined) {\r\n        focus = this._match.getTokens();\r\n      }\r\n\r\n      // Get only some tokens\r\n      else {\r\n        \r\n        // Push newly to focus array\r\n        tokens.forEach(function(term) {\r\n          try {\r\n            // Create info layer objects\r\n            const layer = infoLayerClass.create(term);\r\n            layer.type = \"tokens\";\r\n            focus.push(layer);\r\n          }\r\n          catch (e) {\r\n            return;\r\n          };\r\n        });\r\n      };\r\n      \r\n      // No tokens chosen\r\n      if (focus.length == 0)\r\n        cb(null);\r\n\r\n      try {\r\n        // Get info (may be cached)\r\n        KorAP.API.getMatchInfo(\r\n          this._match,\r\n          { 'spans' : false, 'layer' : focus },\r\n        \r\n          // Callback for retrieval\r\n          function (matchResponse) {\r\n\r\n            if (matchResponse === undefined)\r\n              cb(null);\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n              cb(\r\n                this._table = matchTableClass.create(matchResponse[\"snippet\"])\r\n              );\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n\r\n      /*\r\n      // Todo: Store the table as a hash of the focus\r\n      return null;\r\n      */\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a virtual corpus fragment,\r\n * that can be shown and merged with the\r\n * main VC.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('vc/fragment',['vc/doc', 'util'], function (docClass) {\r\n\r\n  const loc = KorAP.Locale;\r\n  loc.NEW_CONSTRAINT = loc.NEW_CONSTRAINT || 'New Constraint';\r\n  \r\n  // Create a VC doc\r\n  function _doc (op) {\r\n    const doc = document.createElement('div');\r\n    doc.setAttribute('class','doc');\r\n          \r\n    const key = doc.addE('span');\r\n    key.setAttribute('class','key');\r\n    key.addT(op[0]);\r\n\r\n    const match = doc.addE('span');\r\n    match.setAttribute('class','match');\r\n    match.addT('eq');\r\n\r\n    const value = doc.addE('span');\r\n    value.setAttribute('class', 'value');\r\n    value.addT(op[1]);\r\n\r\n    return doc;\r\n  };\r\n\r\n\r\n  // Return object\r\n  return {\r\n\r\n    /**\r\n     * Construct a new VC fragment.\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._operands = [];\r\n      return obj;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add document constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      this._operands.forEach(function (op, i, arr) {\r\n        if (op[0] === key && op[1] === value) {\r\n          arr.splice(i,1);\r\n        }\r\n      });\r\n      this._operands.push([key, value, type]);\r\n      this.update();\r\n    },\r\n\r\n    \r\n    /**\r\n     * Remove document constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      for (let i = 0; i < this._operands.length; i++) {\r\n        let op = this._operands[i];\r\n        if (op[0] === key && op[1] === value) {\r\n          this._operands.splice(i, 1);\r\n          this.update();\r\n          return;\r\n        };\r\n      };\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Check, if the fragment contains any constraints\r\n     */\r\n    isEmpty : function () {\r\n      return this._operands.length > 0 ? false : true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the element associated with the virtual corpus\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined) {\r\n        return this._el;\r\n      };\r\n\r\n      // Initialize element\r\n      const e = this._el = document.createElement('div');\r\n      e.classList.add('vc', 'fragment');\r\n\r\n      // Prepend info text\r\n      e.addE('span').addT(loc.NEW_CONSTRAINT + ':');\r\n      this._frag = e.addE('div');\r\n      \r\n      return e;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return operands as document objects\r\n     */\r\n    documents : function () {\r\n      return this._operands.map(\r\n        function (item) {\r\n          const doc = docClass.create();\r\n          doc.key(item[0]);\r\n          doc.matchop(\"eq\");\r\n          doc.value(item[1]);\r\n          doc.type(item[2] === \"date\" ? \"date\" : \"string\");\r\n          return doc;\r\n        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the whole object based on the underlying data structure\r\n     */\r\n    update : function() {\r\n\r\n      // <div class=\"docGroup\" data-operation=\"and\">\r\n      //   <div class=\"doc\">\r\n      //     <span class=\"key\">author</span>\r\n      //     <span class=\"match\">eq</span>\r\n      //     <span class=\"value\">Baum</span>\r\n      //   </div>\r\n      // </div>\r\n      let root;\r\n      const l = this._operands.length;\r\n\r\n      if (l > 1) {\r\n        root = document.createElement('div');\r\n        root.setAttribute('class','docGroup');\r\n        root.setAttribute('data-operation', 'and');\r\n        this._operands.forEach(i => root.appendChild(_doc(i)));\r\n      }\r\n\r\n      else if (l == 1) {\r\n        root = _doc(this._operands[0]);\r\n      };\r\n\r\n      // Init element\r\n      this.element();\r\n\r\n      const e = this._frag;\r\n      if (l === 0) {\r\n        _removeChildren(e);\r\n      }\r\n      else if (e.firstChild)\r\n        e.replaceChild(root, e.firstChild);\r\n      else\r\n        e.appendChild(root);\r\n        \r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Stringification\r\n     */\r\n    toQuery : function () {\r\n\r\n      if (this._operands.length === 0)\r\n        return '';\r\n\r\n      return this._operands.map(\r\n        function (item) {\r\n          if (item[2] === \"date\") {\r\n            return item[0] + ' in ' + item[1];\r\n          };\r\n          return item[0] + ' = ' + new String(item[1]).quote();\r\n        }\r\n      ).join(\" & \");\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/corpusByMatch',['vc/fragment', 'util'], function (vcFragmentClass) {\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (meta) {\r\n      return Object.create(this)._init(meta);\r\n    },\r\n\r\n\r\n    // Initialize corpusByMatch\r\n    _init : function (meta) {\r\n      const t = this;\r\n\r\n      // Meta is an element <dl />\r\n      if (meta === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n      else if (!(meta instanceof Node)) {\r\n        throw new Error(\"Requires element\");\r\n      };\r\n\r\n      // Collect the meta constraints\r\n      t._vc = {};\r\n\r\n      // Remember the meta table\r\n      t._meta = meta;\r\n\r\n      // CorpusByMatch can be disabled per configuration.\r\n      // This is necessary, as the feature won't work with\r\n      // indices created before Krill V0.57.\r\n      // This is an undocumented feature and will be\r\n      // removed in future versions.\r\n      // This will also require a change in matchinfo.scss\r\n      if (KorAP.Conf && KorAP.Conf[\"CorpusByMatchDisabled\"]) {\r\n        t._meta.classList.add(\"cbm-disabled\");\r\n        return t;\r\n      };\r\n\r\n      t._meta.addEventListener(\r\n        \"click\", t.clickOnMeta.bind(t), false\r\n      );\r\n\r\n      t._fragment = vcFragmentClass.create();      \r\n\r\n      t._fragment.element().addEventListener(\r\n        \"click\", t.toVcBuilder.bind(t), true\r\n      );\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Join fragment with VC\r\n     */\r\n    toVcBuilder : function (e) {\r\n      if (e)\r\n        e.stopPropagation();\r\n\r\n      if (this._fragment.isEmpty())\r\n        return;\r\n\r\n      const vc = KorAP.vc;\r\n      if (!vc) {\r\n        console.log(\"Global VC not established\");\r\n        return;\r\n      };\r\n\r\n      for (const doc of this._fragment.documents()) {\r\n        vc.addRequired(doc);\r\n      };\r\n\r\n      if (!vc.isOpen())\r\n        vc.open();\r\n\r\n      // Scroll to top\r\n      window.scrollTo(0, 0);\r\n    },\r\n\r\n\r\n    // Event handler for meta constraint creation\r\n    clickOnMeta : function (e) {\r\n      e.stopPropagation();\r\n      if (e.target === e.currentTarget) {\r\n        return;\r\n      };\r\n\r\n      // Get event target\r\n      const target = e.target;\r\n\r\n      let key, value, type;\r\n\r\n      // Meta information is a single value\r\n      if (target.tagName === 'DD') {\r\n        type = target.getAttribute(\"data-type\");\r\n        key  = target.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      }\r\n\r\n      // Meta information is in a list\r\n      else if (target.tagName === 'DIV') {\r\n        type = target.parentNode.getAttribute(\"data-type\");\r\n        key = target.parentNode.previousElementSibling.innerText;\r\n        value = target.innerText;\r\n      };\r\n\r\n      // Ignore stored types\r\n      if (type === \"type:store\" || type === \"type:attachement\")\r\n        return;\r\n\r\n      type = type || \"type:string\";\r\n\r\n      // Add or remove the constraint to the fragment\r\n      if (key && value) {\r\n        const t = this;\r\n        if (target.classList.contains(\"chosen\")) {\r\n          target.classList.remove(\"chosen\");\r\n          t.remove(key, value);\r\n        }\r\n        else {\r\n          target.classList.add(\"chosen\");\r\n          t.add(key, value, type);\r\n        };\r\n\r\n        // Check if the fragment is empty\r\n        // If empty - hide!\r\n        if (!t._fragment.isEmpty()) {\r\n          t._meta.parentNode.insertBefore(\r\n            t._fragment.element(),\r\n            t._meta.nextSibling\r\n          );\r\n        }\r\n\r\n        // Otherwise show!\r\n        else {\r\n          t._meta.parentNode.removeChild(\r\n            t._fragment.element()\r\n          );\r\n        };\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Add constraint to fragment\r\n     */\r\n    add : function (key, value, type) {\r\n      type = type.replace(/^type:/, '');\r\n      this._fragment.add(key, value, type);\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove constraint from fragment\r\n     */\r\n    remove : function (key, value) {\r\n      this._fragment.remove(key, value);\r\n    },\r\n    \r\n    /**\r\n     * Stringify fragment\r\n     */\r\n    toQuery : function () {\r\n      return this._fragment.toQuery();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse Data URI scheme for attachement fields\r\n * Afterwards the object has the parameters\r\n * - contentType (defaults to text/plain)\r\n * - base64 (if the data was base64 encoded)\r\n * - isLink (if the contentType is application/x.korap-link)\r\n * - param (as a map of arbitrary parameters)\r\n * - payload (the URI decoded data)\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/attachement',[],function () {\r\n\r\n  const uriRE = new RegExp(\"^data: *([^;,]*?(?: *; *[^,;]+?)*) *, *(.+)$\");\r\n  const mapRE = new RegExp(\"^ *([^=]+?) *= *(.+?) *$\");\r\n\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (url) {\r\n      return Object.create(this)._init(url);\r\n    },\r\n\r\n    // Parse URI scheme\r\n    _init : function (url) {\r\n      const t = this;\r\n\r\n      // Decode\r\n      url = decodeURIComponent(url);\r\n\r\n      if (!uriRE.exec(url))\r\n        return;\r\n\r\n      t.payload = RegExp.$2;\r\n\r\n      let map = {};\r\n      let start = 0;\r\n      t.base64 = false;\r\n      t.isLink = false;\r\n      t.contentType = \"text/plain\";\r\n\r\n      // Split parameter map\r\n      RegExp.$1.split(/ *; */).map(function (item) {\r\n        const t = this;\r\n\r\n        // Check first parameter\r\n        if (!start++ && item.match(/^[-a-z0-9]+?\\/.+$/)) {\r\n          t.contentType = item;\r\n\r\n          if (item === \"application/x.korap-link\")\r\n            t.isLink = true;\r\n        }\r\n       \r\n        // Decode b64\r\n        else if (item.toLowerCase() == \"base64\") {\r\n          t.base64 = true;\r\n          t.payload = window.atob(t.payload);\r\n        }\r\n\r\n        // Parse arbitrary metadata\r\n        else if (mapRE.exec(item)) {\r\n          map[RegExp.$1] = RegExp.$2;\r\n        };\r\n      }.bind(t));\r\n\r\n      t.param = map;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Inline the attachement\r\n     * This should optimally be plugin-treatable\r\n     */ \r\n    inline : function () {\r\n      if (this.isLink) {\r\n        const title = this.param[\"title\"] || this.payload;\r\n        const a = document.createElement('a');\r\n        a.setAttribute('href', this.payload);\r\n        a.setAttribute('rel', 'noopener noreferrer');\r\n        a.addT(title);\r\n        return a;\r\n      };\r\n\r\n      return document.createTextNode(this.payload);\r\n    }\r\n  }\r\n});\r\n\n\r\n\r\ndefine('match/meta',['match/corpusByMatch','match/attachement','util'], function (cbmClass, attClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.METADATA = loc.METADATA || 'Metadata';\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new match object\r\n     */\r\n    create : function (match, fields) {\r\n      return Object.create(this)._init(match, fields);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize object\r\n     */\r\n    _init : function (match, fields) {\r\n      this._match = match;\r\n      this._fields = fields;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Create match reference view.\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      if (this._fields === null)\r\n        return;\r\n\r\n      const metaDL = document.createElement('dl');\r\n      metaDL.classList.add(\"flex\");\r\n\r\n      this._el = metaDL;\r\n\r\n      const fields = this._fields;\r\n\r\n      // Copy original array position to object\r\n      // before sorting by key title\r\n      const posInMetaArray = {};\r\n      fields.forEach((f,i) => posInMetaArray[f[\"key\"]] = i);\r\n\r\n      // TODO: Meta fields should be separated\r\n\r\n      // Sort all meta keys alphabetically\r\n      Object.keys(posInMetaArray).sort().forEach(function(k) {\r\n        let field = fields[posInMetaArray[k]]; // This is the object\r\n\r\n        let metaL, dt, metaDescr, metaDD, att;\r\n\r\n        // Ignore internal IDs\r\n        if (k !== \"UID\" &&\r\n            k !== \"corpusID\" &&\r\n            k !== \"docID\" &&\r\n            k !== \"textID\" &&\r\n            k !== \"layerInfos\") {\r\n\r\n          metaL = document.createElement('div');\r\n          \r\n          dt = metaL.addE('dt');\r\n          dt.addT(k);\r\n          dt.setAttribute(\"title\", k);\r\n          \r\n          metaDescr = field[\"value\"];\r\n          metaDD = metaL.addE('dd');\r\n          metaDD.setAttribute('data-type', field[\"type\"]);\r\n\r\n          if(metaDescr instanceof Array){\r\n        \t  metaDD.classList.add(\"metakeyvalues\");\r\n            metaDescr.forEach(function(md) {\r\n              if (field[\"type\"] === 'type:attachement') {\r\n                att = attClass.create(md);\r\n                if (att)\r\n        \t        metaDD.addE('div').appendChild(att.inline());\r\n              }\r\n              else {\r\n        \t      metaDD.addE('div').addT(md);\r\n              }\r\n        \t  });\r\n          }\r\n          else{\r\n            if (field[\"type\"] === 'type:attachement') {\r\n              att = attClass.create(field[\"value\"]);\r\n              if (att)\r\n                metaDD.appendChild(att.inline());\r\n            }\r\n            else {\r\n              metaDD.addT(field[\"value\"]);\r\n            };\r\n          }\r\n          \r\n          metaDL.appendChild(metaL);\r\n        };\r\n      });\r\n\r\n      // Add corpusByMatch assistant\r\n      this._corpusByMatch = cbmClass.create(this._el);\r\n\r\n      return this._el;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/meta',[\r\n  'view',\r\n  'match/meta'\r\n], function (viewClass, matchMetaClass) {\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n    create : function (match) {\r\n      return Object.create(viewClass)\r\n        ._init(['metatable'])\r\n        .upgradeTo(this)\r\n        ._init(match);\r\n    },\r\n\r\n\r\n    _init : function (match) {\r\n      this._match = match;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const metaTable = document.createElement('div');\r\n      metaTable.classList.add('metatable', 'loading');\r\n\r\n      this.getData(function (meta) {\r\n        if (meta === null)\r\n          return;\r\n\r\n        // Load data\r\n        metaTable.classList.remove('loading');\r\n        metaTable.appendChild(meta.element());\r\n      });\r\n\r\n\r\n      // TODO:\r\n      //   Loading should have a timeout on view-level\r\n      //   matchtable.classList.remove('loading');\r\n\r\n      return this._show = metaTable;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for table\r\n     * representation\r\n     */\r\n    getData : function (cb) {\r\n\r\n      const match = this._match;\r\n      try {\r\n        KorAP.API.getTextInfo(\r\n          match, {}, function (textResponse) {\r\n            \r\n            if (textResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const doc = textResponse[\"document\"];\r\n            if (doc === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            const fields = doc[\"fields\"];\r\n            if (fields === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Add metainfo to matchview\r\n            cb(matchMetaClass.create(\r\n              match, fields\r\n            ));\r\n          }\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n\r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define('lib/dagre',[],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.dagre=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\r\n/*\r\nCopyright (c) 2012-2014 Chris Pettitt\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nmodule.exports = {\r\n  graphlib: require(\"./lib/graphlib\"),\r\n\r\n  layout: require(\"./lib/layout\"),\r\n  debug: require(\"./lib/debug\"),\r\n  util: {\r\n    time: require(\"./lib/util\").time,\r\n    notime: require(\"./lib/util\").notime\r\n  },\r\n  version: require(\"./lib/version\")\r\n};\r\n\r\n},{\"./lib/debug\":6,\"./lib/graphlib\":7,\"./lib/layout\":9,\"./lib/util\":29,\"./lib/version\":30}],2:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    greedyFAS = require(\"./greedy-fas\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\nfunction run(g) {\r\n  var fas = (g.graph().acyclicer === \"greedy\"\r\n                ? greedyFAS(g, weightFn(g))\r\n                : dfsFAS(g));\r\n  _.each(fas, function(e) {\r\n    var label = g.edge(e);\r\n    g.removeEdge(e);\r\n    label.forwardName = e.name;\r\n    label.reversed = true;\r\n    g.setEdge(e.w, e.v, label, _.uniqueId(\"rev\"));\r\n  });\r\n\r\n  function weightFn(g) {\r\n    return function(e) {\r\n      return g.edge(e).weight;\r\n    };\r\n  }\r\n}\r\n\r\nfunction dfsFAS(g) {\r\n  var fas = [],\r\n      stack = {},\r\n      visited = {};\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) {\r\n      return;\r\n    }\r\n    visited[v] = true;\r\n    stack[v] = true;\r\n    _.each(g.outEdges(v), function(e) {\r\n      if (_.has(stack, e.w)) {\r\n        fas.push(e);\r\n      } else {\r\n        dfs(e.w);\r\n      }\r\n    });\r\n    delete stack[v];\r\n  }\r\n\r\n  _.each(g.nodes(), dfs);\r\n  return fas;\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var label = g.edge(e);\r\n    if (label.reversed) {\r\n      g.removeEdge(e);\r\n\r\n      var forwardName = label.forwardName;\r\n      delete label.reversed;\r\n      delete label.forwardName;\r\n      g.setEdge(e.w, e.v, label, forwardName);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./greedy-fas\":8,\"./lodash\":10}],3:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = addBorderSegments;\r\n\r\nfunction addBorderSegments(g) {\r\n  function dfs(v) {\r\n    var children = g.children(v),\r\n        node = g.node(v);\r\n    if (children.length) {\r\n      _.each(children, dfs);\r\n    }\r\n\r\n    if (_.has(node, \"minRank\")) {\r\n      node.borderLeft = [];\r\n      node.borderRight = [];\r\n      for (var rank = node.minRank, maxRank = node.maxRank + 1;\r\n           rank < maxRank;\r\n           ++rank) {\r\n        addBorderNode(g, \"borderLeft\", \"_bl\", v, node, rank);\r\n        addBorderNode(g, \"borderRight\", \"_br\", v, node, rank);\r\n      }\r\n    }\r\n  }\r\n\r\n  _.each(g.children(), dfs);\r\n}\r\n\r\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\r\n  var label = { width: 0, height: 0, rank: rank },\r\n      prev = sgNode[prop][rank - 1],\r\n      curr = util.addDummyNode(g, \"border\", label, prefix);\r\n  sgNode[prop][rank] = curr;\r\n  g.setParent(curr, sg);\r\n  if (prev) {\r\n    g.setEdge(prev, curr, { weight: 1 });\r\n  }\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],4:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = {\r\n  adjust: adjust,\r\n  undo: undo\r\n};\r\n\r\nfunction adjust(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction undo(g) {\r\n  var rankDir = g.graph().rankdir.toLowerCase();\r\n  if (rankDir === \"bt\" || rankDir === \"rl\") {\r\n    reverseY(g);\r\n  }\r\n\r\n  if (rankDir === \"lr\" || rankDir === \"rl\") {\r\n    swapXY(g);\r\n    swapWidthHeight(g);\r\n  }\r\n}\r\n\r\nfunction swapWidthHeight(g) {\r\n  _.each(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\r\n  _.each(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\r\n}\r\n\r\nfunction swapWidthHeightOne(attrs) {\r\n  var w = attrs.width;\r\n  attrs.width = attrs.height;\r\n  attrs.height = w;\r\n}\r\n\r\nfunction reverseY(g) {\r\n  _.each(g.nodes(), function(v) { reverseYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, reverseYOne);\r\n    if (_.has(edge, \"y\")) {\r\n      reverseYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction reverseYOne(attrs) {\r\n  attrs.y = -attrs.y;\r\n}\r\n\r\nfunction swapXY(g) {\r\n  _.each(g.nodes(), function(v) { swapXYOne(g.node(v)); });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, swapXYOne);\r\n    if (_.has(edge, \"x\")) {\r\n      swapXYOne(edge);\r\n    }\r\n  });\r\n}\r\n\r\nfunction swapXYOne(attrs) {\r\n  var x = attrs.x;\r\n  attrs.x = attrs.y;\r\n  attrs.y = x;\r\n}\r\n\r\n},{\"./lodash\":10}],5:[function(require,module,exports){\r\n/*\r\n * Simple doubly linked list implementation derived from Cormen, et al.,\r\n * \"Introduction to Algorithms\".\r\n */\r\n\r\nmodule.exports = List;\r\n\r\nfunction List() {\r\n  var sentinel = {};\r\n  sentinel._next = sentinel._prev = sentinel;\r\n  this._sentinel = sentinel;\r\n}\r\n\r\nList.prototype.dequeue = function() {\r\n  var sentinel = this._sentinel,\r\n      entry = sentinel._prev;\r\n  if (entry !== sentinel) {\r\n    unlink(entry);\r\n    return entry;\r\n  }\r\n};\r\n\r\nList.prototype.enqueue = function(entry) {\r\n  var sentinel = this._sentinel;\r\n  if (entry._prev && entry._next) {\r\n    unlink(entry);\r\n  }\r\n  entry._next = sentinel._next;\r\n  sentinel._next._prev = entry;\r\n  sentinel._next = entry;\r\n  entry._prev = sentinel;\r\n};\r\n\r\nList.prototype.toString = function() {\r\n  var strs = [],\r\n      sentinel = this._sentinel,\r\n      curr = sentinel._prev;\r\n  while (curr !== sentinel) {\r\n    strs.push(JSON.stringify(curr, filterOutLinks));\r\n    curr = curr._prev;\r\n  }\r\n  return \"[\" + strs.join(\", \") + \"]\";\r\n};\r\n\r\nfunction unlink(entry) {\r\n  entry._prev._next = entry._next;\r\n  entry._next._prev = entry._prev;\r\n  delete entry._next;\r\n  delete entry._prev;\r\n}\r\n\r\nfunction filterOutLinks(k, v) {\r\n  if (k !== \"_next\" && k !== \"_prev\") {\r\n    return v;\r\n  }\r\n}\r\n\r\n},{}],6:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  debugOrdering: debugOrdering\r\n};\r\n\r\n/* istanbul ignore next */\r\nfunction debugOrdering(g) {\r\n  var layerMatrix = util.buildLayerMatrix(g);\r\n\r\n  var h = new Graph({ compound: true, multigraph: true }).setGraph({});\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    h.setNode(v, { label: v });\r\n    h.setParent(v, \"layer\" + g.node(v).rank);\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    h.setEdge(e.v, e.w, {}, e.name);\r\n  });\r\n\r\n  _.each(layerMatrix, function(layer, i) {\r\n    var layerV = \"layer\" + i;\r\n    h.setNode(layerV, { rank: \"same\" });\r\n    _.reduce(layer, function(u, v) {\r\n      h.setEdge(u, v, { style: \"invis\" });\r\n      return v;\r\n    });\r\n  });\r\n\r\n  return h;\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10,\"./util\":29}],7:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar graphlib;\r\n\r\nif (require) {\r\n  try {\r\n    graphlib = require(\"graphlib\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!graphlib) {\r\n  graphlib = window.graphlib;\r\n}\r\n\r\nmodule.exports = graphlib;\r\n\r\n},{\"graphlib\":31}],8:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph,\r\n    List = require(\"./data/list\");\r\n\r\n/*\r\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\r\n * arc set is a set of edges that can be removed to make a graph acyclic.\r\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\r\n * effective heuristic for the feedback arc set problem.\" This implementation\r\n * adjusts that from the paper to allow for weighted edges.\r\n */\r\nmodule.exports = greedyFAS;\r\n\r\nvar DEFAULT_WEIGHT_FN = _.constant(1);\r\n\r\nfunction greedyFAS(g, weightFn) {\r\n  if (g.nodeCount() <= 1) {\r\n    return [];\r\n  }\r\n  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\r\n  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\r\n\r\n  // Expand multi-edges\r\n  return _.flatten(_.map(results, function(e) {\r\n    return g.outEdges(e.v, e.w);\r\n  }), true);\r\n}\r\n\r\nfunction doGreedyFAS(g, buckets, zeroIdx) {\r\n  var results = [],\r\n      sources = buckets[buckets.length - 1],\r\n      sinks = buckets[0];\r\n\r\n  var entry;\r\n  while (g.nodeCount()) {\r\n    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }\r\n    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\r\n    if (g.nodeCount()) {\r\n      for (var i = buckets.length - 2; i > 0; --i) {\r\n        entry = buckets[i].dequeue();\r\n        if (entry) {\r\n          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\r\n  var results = collectPredecessors ? [] : undefined;\r\n\r\n  _.each(g.inEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        uEntry = g.node(edge.v);\r\n\r\n    if (collectPredecessors) {\r\n      results.push({ v: edge.v, w: edge.w });\r\n    }\r\n\r\n    uEntry.out -= weight;\r\n    assignBucket(buckets, zeroIdx, uEntry);\r\n  });\r\n\r\n  _.each(g.outEdges(entry.v), function(edge) {\r\n    var weight = g.edge(edge),\r\n        w = edge.w,\r\n        wEntry = g.node(w);\r\n    wEntry[\"in\"] -= weight;\r\n    assignBucket(buckets, zeroIdx, wEntry);\r\n  });\r\n\r\n  g.removeNode(entry.v);\r\n\r\n  return results;\r\n}\r\n\r\nfunction buildState(g, weightFn) {\r\n  var fasGraph = new Graph(),\r\n      maxIn = 0,\r\n      maxOut = 0;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    fasGraph.setNode(v, { v: v, \"in\": 0, out: 0 });\r\n  });\r\n\r\n  // Aggregate weights on nodes, but also sum the weights across multi-edges\r\n  // into a single edge for the fasGraph.\r\n  _.each(g.edges(), function(e) {\r\n    var prevWeight = fasGraph.edge(e.v, e.w) || 0,\r\n        weight = weightFn(e),\r\n        edgeWeight = prevWeight + weight;\r\n    fasGraph.setEdge(e.v, e.w, edgeWeight);\r\n    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\r\n    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)[\"in\"]  += weight);\r\n  });\r\n\r\n  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\r\n  var zeroIdx = maxIn + 1;\r\n\r\n  _.each(fasGraph.nodes(), function(v) {\r\n    assignBucket(buckets, zeroIdx, fasGraph.node(v));\r\n  });\r\n\r\n  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\r\n}\r\n\r\nfunction assignBucket(buckets, zeroIdx, entry) {\r\n  if (!entry.out) {\r\n    buckets[0].enqueue(entry);\r\n  } else if (!entry[\"in\"]) {\r\n    buckets[buckets.length - 1].enqueue(entry);\r\n  } else {\r\n    buckets[entry.out - entry[\"in\"] + zeroIdx].enqueue(entry);\r\n  }\r\n}\r\n\r\n},{\"./data/list\":5,\"./graphlib\":7,\"./lodash\":10}],9:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    acyclic = require(\"./acyclic\"),\r\n    normalize = require(\"./normalize\"),\r\n    rank = require(\"./rank\"),\r\n    normalizeRanks = require(\"./util\").normalizeRanks,\r\n    parentDummyChains = require(\"./parent-dummy-chains\"),\r\n    removeEmptyRanks = require(\"./util\").removeEmptyRanks,\r\n    nestingGraph = require(\"./nesting-graph\"),\r\n    addBorderSegments = require(\"./add-border-segments\"),\r\n    coordinateSystem = require(\"./coordinate-system\"),\r\n    order = require(\"./order\"),\r\n    position = require(\"./position\"),\r\n    util = require(\"./util\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = layout;\r\n\r\nfunction layout(g, opts) {\r\n  var time = opts && opts.debugTiming ? util.time : util.notime;\r\n  time(\"layout\", function() {\r\n    var layoutGraph = time(\"  buildLayoutGraph\",\r\n                               function() { return buildLayoutGraph(g); });\r\n    time(\"  runLayout\",        function() { runLayout(layoutGraph, time); });\r\n    time(\"  updateInputGraph\", function() { updateInputGraph(g, layoutGraph); });\r\n  });\r\n}\r\n\r\nfunction runLayout(g, time) {\r\n  time(\"    makeSpaceForEdgeLabels\", function() { makeSpaceForEdgeLabels(g); });\r\n  time(\"    removeSelfEdges\",        function() { removeSelfEdges(g); });\r\n  time(\"    acyclic\",                function() { acyclic.run(g); });\r\n  time(\"    nestingGraph.run\",       function() { nestingGraph.run(g); });\r\n  time(\"    rank\",                   function() { rank(util.asNonCompoundGraph(g)); });\r\n  time(\"    injectEdgeLabelProxies\", function() { injectEdgeLabelProxies(g); });\r\n  time(\"    removeEmptyRanks\",       function() { removeEmptyRanks(g); });\r\n  time(\"    nestingGraph.cleanup\",   function() { nestingGraph.cleanup(g); });\r\n  time(\"    normalizeRanks\",         function() { normalizeRanks(g); });\r\n  time(\"    assignRankMinMax\",       function() { assignRankMinMax(g); });\r\n  time(\"    removeEdgeLabelProxies\", function() { removeEdgeLabelProxies(g); });\r\n  time(\"    normalize.run\",          function() { normalize.run(g); });\r\n  time(\"    parentDummyChains\",      function() { parentDummyChains(g); });\r\n  time(\"    addBorderSegments\",      function() { addBorderSegments(g); });\r\n  time(\"    order\",                  function() { order(g); });\r\n  time(\"    insertSelfEdges\",        function() { insertSelfEdges(g); });\r\n  time(\"    adjustCoordinateSystem\", function() { coordinateSystem.adjust(g); });\r\n  time(\"    position\",               function() { position(g); });\r\n  time(\"    positionSelfEdges\",      function() { positionSelfEdges(g); });\r\n  time(\"    removeBorderNodes\",      function() { removeBorderNodes(g); });\r\n  time(\"    normalize.undo\",         function() { normalize.undo(g); });\r\n  time(\"    fixupEdgeLabelCoords\",   function() { fixupEdgeLabelCoords(g); });\r\n  time(\"    undoCoordinateSystem\",   function() { coordinateSystem.undo(g); });\r\n  time(\"    translateGraph\",         function() { translateGraph(g); });\r\n  time(\"    assignNodeIntersects\",   function() { assignNodeIntersects(g); });\r\n  time(\"    reversePoints\",          function() { reversePointsForReversedEdges(g); });\r\n  time(\"    acyclic.undo\",           function() { acyclic.undo(g); });\r\n}\r\n\r\n/*\r\n * Copies final layout information from the layout graph back to the input\r\n * graph. This process only copies whitelisted attributes from the layout graph\r\n * to the input graph, so it serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction updateInputGraph(inputGraph, layoutGraph) {\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var inputLabel = inputGraph.node(v),\r\n        layoutLabel = layoutGraph.node(v);\r\n\r\n    if (inputLabel) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n\r\n      if (layoutGraph.children(v).length) {\r\n        inputLabel.width = layoutLabel.width;\r\n        inputLabel.height = layoutLabel.height;\r\n      }\r\n    }\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var inputLabel = inputGraph.edge(e),\r\n        layoutLabel = layoutGraph.edge(e);\r\n\r\n    inputLabel.points = layoutLabel.points;\r\n    if (_.has(layoutLabel, \"x\")) {\r\n      inputLabel.x = layoutLabel.x;\r\n      inputLabel.y = layoutLabel.y;\r\n    }\r\n  });\r\n\r\n  inputGraph.graph().width = layoutGraph.graph().width;\r\n  inputGraph.graph().height = layoutGraph.graph().height;\r\n}\r\n\r\nvar graphNumAttrs = [\"nodesep\", \"edgesep\", \"ranksep\", \"marginx\", \"marginy\"],\r\n    graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: \"tb\" },\r\n    graphAttrs = [\"acyclicer\", \"ranker\", \"rankdir\", \"align\"],\r\n    nodeNumAttrs = [\"width\", \"height\"],\r\n    nodeDefaults = { width: 0, height: 0 },\r\n    edgeNumAttrs = [\"minlen\", \"weight\", \"width\", \"height\", \"labeloffset\"],\r\n    edgeDefaults = {\r\n      minlen: 1, weight: 1, width: 0, height: 0,\r\n      labeloffset: 10, labelpos: \"r\"\r\n    },\r\n    edgeAttrs = [\"labelpos\"];\r\n\r\n/*\r\n * Constructs a new graph from the input graph, which can be used for layout.\r\n * This process copies only whitelisted attributes from the input graph to the\r\n * layout graph. Thus this function serves as a good place to determine what\r\n * attributes can influence layout.\r\n */\r\nfunction buildLayoutGraph(inputGraph) {\r\n  var g = new Graph({ multigraph: true, compound: true }),\r\n      graph = canonicalize(inputGraph.graph());\r\n\r\n  g.setGraph(_.merge({},\r\n    graphDefaults,\r\n    selectNumberAttrs(graph, graphNumAttrs),\r\n    _.pick(graph, graphAttrs)));\r\n\r\n  _.each(inputGraph.nodes(), function(v) {\r\n    var node = canonicalize(inputGraph.node(v));\r\n    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\r\n    g.setParent(v, inputGraph.parent(v));\r\n  });\r\n\r\n  _.each(inputGraph.edges(), function(e) {\r\n    var edge = canonicalize(inputGraph.edge(e));\r\n    g.setEdge(e, _.merge({},\r\n      edgeDefaults,\r\n      selectNumberAttrs(edge, edgeNumAttrs),\r\n      _.pick(edge, edgeAttrs)));\r\n  });\r\n\r\n  return g;\r\n}\r\n\r\n/*\r\n * This idea comes from the Gansner paper: to account for edge labels in our\r\n * layout we split each rank in half by doubling minlen and halving ranksep.\r\n * Then we can place labels at these mid-points between nodes.\r\n *\r\n * We also add some minimal padding to the width to push the label for the edge\r\n * away from the edge itself a bit.\r\n */\r\nfunction makeSpaceForEdgeLabels(g) {\r\n  var graph = g.graph();\r\n  graph.ranksep /= 2;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    edge.minlen *= 2;\r\n    if (edge.labelpos.toLowerCase() !== \"c\") {\r\n      if (graph.rankdir === \"TB\" || graph.rankdir === \"BT\") {\r\n        edge.width += edge.labeloffset;\r\n      } else {\r\n        edge.height += edge.labeloffset;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/*\r\n * Creates temporary dummy nodes that capture the rank in which each edge's\r\n * label is going to, if it has one of non-zero width and height. We do this\r\n * so that we can safely remove empty ranks while preserving balance for the\r\n * label's position.\r\n */\r\nfunction injectEdgeLabelProxies(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.width && edge.height) {\r\n      var v = g.node(e.v),\r\n          w = g.node(e.w),\r\n          label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\r\n      util.addDummyNode(g, \"edge-proxy\", label, \"_ep\");\r\n    }\r\n  });\r\n}\r\n\r\nfunction assignRankMinMax(g) {\r\n  var maxRank = 0;\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.borderTop) {\r\n      node.minRank = g.node(node.borderTop).rank;\r\n      node.maxRank = g.node(node.borderBottom).rank;\r\n      maxRank = _.max(maxRank, node.maxRank);\r\n    }\r\n  });\r\n  g.graph().maxRank = maxRank;\r\n}\r\n\r\nfunction removeEdgeLabelProxies(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"edge-proxy\") {\r\n      g.edge(node.e).labelRank = node.rank;\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction translateGraph(g) {\r\n  var minX = Number.POSITIVE_INFINITY,\r\n      maxX = 0,\r\n      minY = Number.POSITIVE_INFINITY,\r\n      maxY = 0,\r\n      graphLabel = g.graph(),\r\n      marginX = graphLabel.marginx || 0,\r\n      marginY = graphLabel.marginy || 0;\r\n\r\n  function getExtremes(attrs) {\r\n    var x = attrs.x,\r\n        y = attrs.y,\r\n        w = attrs.width,\r\n        h = attrs.height;\r\n    minX = Math.min(minX, x - w / 2);\r\n    maxX = Math.max(maxX, x + w / 2);\r\n    minY = Math.min(minY, y - h / 2);\r\n    maxY = Math.max(maxY, y + h / 2);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) { getExtremes(g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      getExtremes(edge);\r\n    }\r\n  });\r\n\r\n  minX -= marginX;\r\n  minY -= marginY;\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    node.x -= minX;\r\n    node.y -= minY;\r\n  });\r\n\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    _.each(edge.points, function(p) {\r\n      p.x -= minX;\r\n      p.y -= minY;\r\n    });\r\n    if (_.has(edge, \"x\")) { edge.x -= minX; }\r\n    if (_.has(edge, \"y\")) { edge.y -= minY; }\r\n  });\r\n\r\n  graphLabel.width = maxX - minX + marginX;\r\n  graphLabel.height = maxY - minY + marginY;\r\n}\r\n\r\nfunction assignNodeIntersects(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e),\r\n        nodeV = g.node(e.v),\r\n        nodeW = g.node(e.w),\r\n        p1, p2;\r\n    if (!edge.points) {\r\n      edge.points = [];\r\n      p1 = nodeW;\r\n      p2 = nodeV;\r\n    } else {\r\n      p1 = edge.points[0];\r\n      p2 = edge.points[edge.points.length - 1];\r\n    }\r\n    edge.points.unshift(util.intersectRect(nodeV, p1));\r\n    edge.points.push(util.intersectRect(nodeW, p2));\r\n  });\r\n}\r\n\r\nfunction fixupEdgeLabelCoords(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (_.has(edge, \"x\")) {\r\n      if (edge.labelpos === \"l\" || edge.labelpos === \"r\") {\r\n        edge.width -= edge.labeloffset;\r\n      }\r\n      switch (edge.labelpos) {\r\n        case \"l\": edge.x -= edge.width / 2 + edge.labeloffset; break;\r\n        case \"r\": edge.x += edge.width / 2 + edge.labeloffset; break;\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\nfunction reversePointsForReversedEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.reversed) {\r\n      edge.points.reverse();\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeBorderNodes(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.children(v).length) {\r\n      var node = g.node(v),\r\n          t = g.node(node.borderTop),\r\n          b = g.node(node.borderBottom),\r\n          l = g.node(_.last(node.borderLeft)),\r\n          r = g.node(_.last(node.borderRight));\r\n\r\n      node.width = Math.abs(r.x - l.x);\r\n      node.height = Math.abs(b.y - t.y);\r\n      node.x = l.x + node.width / 2;\r\n      node.y = t.y + node.height / 2;\r\n    }\r\n  });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    if (g.node(v).dummy === \"border\") {\r\n      g.removeNode(v);\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeSelfEdges(g) {\r\n  _.each(g.edges(), function(e) {\r\n    if (e.v === e.w) {\r\n      var node = g.node(e.v);\r\n      if (!node.selfEdges) {\r\n        node.selfEdges = [];\r\n      }\r\n      node.selfEdges.push({ e: e, label: g.edge(e) });\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction insertSelfEdges(g) {\r\n  var layers = util.buildLayerMatrix(g);\r\n  _.each(layers, function(layer) {\r\n    var orderShift = 0;\r\n    _.each(layer, function(v, i) {\r\n      var node = g.node(v);\r\n      node.order = i + orderShift;\r\n      _.each(node.selfEdges, function(selfEdge) {\r\n        util.addDummyNode(g, \"selfedge\", {\r\n          width: selfEdge.label.width,\r\n          height: selfEdge.label.height,\r\n          rank: node.rank,\r\n          order: i + (++orderShift),\r\n          e: selfEdge.e,\r\n          label: selfEdge.label\r\n        }, \"_se\");\r\n      });\r\n      delete node.selfEdges;\r\n    });\r\n  });\r\n}\r\n\r\nfunction positionSelfEdges(g) {\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (node.dummy === \"selfedge\") {\r\n      var selfNode = g.node(node.e.v),\r\n          x = selfNode.x + selfNode.width / 2,\r\n          y = selfNode.y,\r\n          dx = node.x - x,\r\n          dy = selfNode.height / 2;\r\n      g.setEdge(node.e, node.label);\r\n      g.removeNode(v);\r\n      node.label.points = [\r\n        { x: x + 2 * dx / 3, y: y - dy },\r\n        { x: x + 5 * dx / 6, y: y - dy },\r\n        { x: x +     dx    , y: y },\r\n        { x: x + 5 * dx / 6, y: y + dy },\r\n        { x: x + 2 * dx / 3, y: y + dy },\r\n      ];\r\n      node.label.x = node.x;\r\n      node.label.y = node.y;\r\n    }\r\n  });\r\n}\r\n\r\nfunction selectNumberAttrs(obj, attrs) {\r\n  return _.mapValues(_.pick(obj, attrs), Number);\r\n}\r\n\r\nfunction canonicalize(attrs) {\r\n  var newAttrs = {};\r\n  _.each(attrs, function(v, k) {\r\n    newAttrs[k.toLowerCase()] = v;\r\n  });\r\n  return newAttrs;\r\n}\r\n\r\n},{\"./acyclic\":2,\"./add-border-segments\":3,\"./coordinate-system\":4,\"./graphlib\":7,\"./lodash\":10,\"./nesting-graph\":11,\"./normalize\":12,\"./order\":17,\"./parent-dummy-chains\":22,\"./position\":24,\"./rank\":26,\"./util\":29}],10:[function(require,module,exports){\r\n/* global window */\r\n\r\nvar lodash;\r\n\r\nif (require) {\r\n  try {\r\n    lodash = require(\"lodash\");\r\n  } catch (e) {}\r\n}\r\n\r\nif (!lodash) {\r\n  lodash = window._;\r\n}\r\n\r\nmodule.exports = lodash;\r\n\r\n},{\"lodash\":51}],11:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  cleanup: cleanup\r\n};\r\n\r\n/*\r\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\r\n * adds appropriate edges to ensure that all cluster nodes are placed between\r\n * these boundries, and ensures that the graph is connected.\r\n *\r\n * In addition we ensure, through the use of the minlen property, that nodes\r\n * and subgraph border nodes to not end up on the same rank.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Nodes in the input graph has a minlen attribute\r\n *\r\n * Postconditions:\r\n *\r\n *    1. Input graph is connected.\r\n *    2. Dummy nodes are added for the tops and bottoms of subgraphs.\r\n *    3. The minlen attribute for nodes is adjusted to ensure nodes do not\r\n *       get placed on the same rank as subgraph border nodes.\r\n *\r\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\r\n * Graphs.\"\r\n */\r\nfunction run(g) {\r\n  var root = util.addDummyNode(g, \"root\", {}, \"_root\"),\r\n      depths = treeDepths(g),\r\n      height = _.max(depths) - 1,\r\n      nodeSep = 2 * height + 1;\r\n\r\n  g.graph().nestingRoot = root;\r\n\r\n  // Multiply minlen by nodeSep to align nodes on non-border ranks.\r\n  _.each(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\r\n\r\n  // Calculate a weight that is sufficient to keep subgraphs vertically compact\r\n  var weight = sumWeights(g) + 1;\r\n\r\n  // Create border nodes and link them up\r\n  _.each(g.children(), function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n  });\r\n\r\n  // Save the multiplier for node layers for later removal of empty border\r\n  // layers.\r\n  g.graph().nodeRankFactor = nodeSep;\r\n}\r\n\r\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\r\n  var children = g.children(v);\r\n  if (!children.length) {\r\n    if (v !== root) {\r\n      g.setEdge(root, v, { weight: 0, minlen: nodeSep });\r\n    }\r\n    return;\r\n  }\r\n\r\n  var top = util.addBorderNode(g, \"_bt\"),\r\n      bottom = util.addBorderNode(g, \"_bb\"),\r\n      label = g.node(v);\r\n\r\n  g.setParent(top, v);\r\n  label.borderTop = top;\r\n  g.setParent(bottom, v);\r\n  label.borderBottom = bottom;\r\n\r\n  _.each(children, function(child) {\r\n    dfs(g, root, nodeSep, weight, height, depths, child);\r\n\r\n    var childNode = g.node(child),\r\n        childTop = childNode.borderTop ? childNode.borderTop : child,\r\n        childBottom = childNode.borderBottom ? childNode.borderBottom : child,\r\n        thisWeight = childNode.borderTop ? weight : 2 * weight,\r\n        minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\r\n\r\n    g.setEdge(top, childTop, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n\r\n    g.setEdge(childBottom, bottom, {\r\n      weight: thisWeight,\r\n      minlen: minlen,\r\n      nestingEdge: true\r\n    });\r\n  });\r\n\r\n  if (!g.parent(v)) {\r\n    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\r\n  }\r\n}\r\n\r\nfunction treeDepths(g) {\r\n  var depths = {};\r\n  function dfs(v, depth) {\r\n    var children = g.children(v);\r\n    if (children && children.length) {\r\n      _.each(children, function(child) {\r\n        dfs(child, depth + 1);\r\n      });\r\n    }\r\n    depths[v] = depth;\r\n  }\r\n  _.each(g.children(), function(v) { dfs(v, 1); });\r\n  return depths;\r\n}\r\n\r\nfunction sumWeights(g) {\r\n  return _.reduce(g.edges(), function(acc, e) {\r\n    return acc + g.edge(e).weight;\r\n  }, 0);\r\n}\r\n\r\nfunction cleanup(g) {\r\n  var graphLabel = g.graph();\r\n  g.removeNode(graphLabel.nestingRoot);\r\n  delete graphLabel.nestingRoot;\r\n  _.each(g.edges(), function(e) {\r\n    var edge = g.edge(e);\r\n    if (edge.nestingEdge) {\r\n      g.removeEdge(e);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],12:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    util = require(\"./util\");\r\n\r\nmodule.exports = {\r\n  run: run,\r\n  undo: undo\r\n};\r\n\r\n/*\r\n * Breaks any long edges in the graph into short segments that span 1 layer\r\n * each. This operation is undoable with the denormalize function.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. The input graph is a DAG.\r\n *    2. Each node in the graph has a \"rank\" property.\r\n *\r\n * Post-condition:\r\n *\r\n *    1. All edges in the graph have a length of 1.\r\n *    2. Dummy nodes are added where edges have been split into segments.\r\n *    3. The graph is augmented with a \"dummyChains\" attribute which contains\r\n *       the first dummy in each chain of dummy nodes produced.\r\n */\r\nfunction run(g) {\r\n  g.graph().dummyChains = [];\r\n  _.each(g.edges(), function(edge) { normalizeEdge(g, edge); });\r\n}\r\n\r\nfunction normalizeEdge(g, e) {\r\n  var v = e.v,\r\n      vRank = g.node(v).rank,\r\n      w = e.w,\r\n      wRank = g.node(w).rank,\r\n      name = e.name,\r\n      edgeLabel = g.edge(e),\r\n      labelRank = edgeLabel.labelRank;\r\n\r\n  if (wRank === vRank + 1) return;\r\n\r\n  g.removeEdge(e);\r\n\r\n  var dummy, attrs, i;\r\n  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\r\n    edgeLabel.points = [];\r\n    attrs = {\r\n      width: 0, height: 0,\r\n      edgeLabel: edgeLabel, edgeObj: e,\r\n      rank: vRank\r\n    };\r\n    dummy = util.addDummyNode(g, \"edge\", attrs, \"_d\");\r\n    if (vRank === labelRank) {\r\n      attrs.width = edgeLabel.width;\r\n      attrs.height = edgeLabel.height;\r\n      attrs.dummy = \"edge-label\";\r\n      attrs.labelpos = edgeLabel.labelpos;\r\n    }\r\n    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\r\n    if (i === 0) {\r\n      g.graph().dummyChains.push(dummy);\r\n    }\r\n    v = dummy;\r\n  }\r\n\r\n  g.setEdge(v, w, { weight: edgeLabel.weight }, name);\r\n}\r\n\r\nfunction undo(g) {\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        origLabel = node.edgeLabel,\r\n        w;\r\n    g.setEdge(node.edgeObj, origLabel);\r\n    while (node.dummy) {\r\n      w = g.successors(v)[0];\r\n      g.removeNode(v);\r\n      origLabel.points.push({ x: node.x, y: node.y });\r\n      if (node.dummy === \"edge-label\") {\r\n        origLabel.x = node.x;\r\n        origLabel.y = node.y;\r\n        origLabel.width = node.width;\r\n        origLabel.height = node.height;\r\n      }\r\n      v = w;\r\n      node = g.node(v);\r\n    }\r\n  });\r\n}\r\n\r\n},{\"./lodash\":10,\"./util\":29}],13:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = addSubgraphConstraints;\r\n\r\nfunction addSubgraphConstraints(g, cg, vs) {\r\n  var prev = {},\r\n      rootPrev;\r\n\r\n  _.each(vs, function(v) {\r\n    var child = g.parent(v),\r\n        parent,\r\n        prevChild;\r\n    while (child) {\r\n      parent = g.parent(child);\r\n      if (parent) {\r\n        prevChild = prev[parent];\r\n        prev[parent] = child;\r\n      } else {\r\n        prevChild = rootPrev;\r\n        rootPrev = child;\r\n      }\r\n      if (prevChild && prevChild !== child) {\r\n        cg.setEdge(prevChild, child);\r\n        return;\r\n      }\r\n      child = parent;\r\n    }\r\n  });\r\n\r\n  /*\r\n  function dfs(v) {\r\n    var children = v ? g.children(v) : g.children();\r\n    if (children.length) {\r\n      var min = Number.POSITIVE_INFINITY,\r\n          subgraphs = [];\r\n      _.each(children, function(child) {\r\n        var childMin = dfs(child);\r\n        if (g.children(child).length) {\r\n          subgraphs.push({ v: child, order: childMin });\r\n        }\r\n        min = Math.min(min, childMin);\r\n      });\r\n      _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\r\n        cg.setEdge(prev.v, curr.v);\r\n        return curr;\r\n      });\r\n      return min;\r\n    }\r\n    return g.node(v).order;\r\n  }\r\n  dfs(undefined);\r\n  */\r\n}\r\n\r\n},{\"../lodash\":10}],14:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = barycenter;\r\n\r\nfunction barycenter(g, movable) {\r\n  return _.map(movable, function(v) {\r\n    var inV = g.inEdges(v);\r\n    if (!inV.length) {\r\n      return { v: v };\r\n    } else {\r\n      var result = _.reduce(inV, function(acc, e) {\r\n        var edge = g.edge(e),\r\n            nodeU = g.node(e.v);\r\n        return {\r\n          sum: acc.sum + (edge.weight * nodeU.order),\r\n          weight: acc.weight + edge.weight\r\n        };\r\n      }, { sum: 0, weight: 0 });\r\n\r\n      return {\r\n        v: v,\r\n        barycenter: result.sum / result.weight,\r\n        weight: result.weight\r\n      };\r\n    }\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10}],15:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph;\r\n\r\nmodule.exports = buildLayerGraph;\r\n\r\n/*\r\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\r\n * contain all base and subgraph nodes from the request layer in their original\r\n * hierarchy and any edges that are incident on these nodes and are of the type\r\n * requested by the \"relationship\" parameter.\r\n *\r\n * Nodes from the requested rank that do not have parents are assigned a root\r\n * node in the output graph, which is set in the root graph attribute. This\r\n * makes it easy to walk the hierarchy of movable nodes during ordering.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG\r\n *    2. Base nodes in the input graph have a rank attribute\r\n *    3. Subgraph nodes in the input graph has minRank and maxRank attributes\r\n *    4. Edges have an assigned weight\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Output graph has all nodes in the movable rank with preserved\r\n *       hierarchy.\r\n *    2. Root nodes in the movable layer are made children of the node\r\n *       indicated by the root attribute of the graph.\r\n *    3. Non-movable nodes incident on movable nodes, selected by the\r\n *       relationship parameter, are included in the graph (without hierarchy).\r\n *    4. Edges incident on movable nodes, selected by the relationship\r\n *       parameter, are added to the output graph.\r\n *    5. The weights for copied edges are aggregated as need, since the output\r\n *       graph is not a multi-graph.\r\n */\r\nfunction buildLayerGraph(g, rank, relationship) {\r\n  var root = createRootNode(g),\r\n      result = new Graph({ compound: true }).setGraph({ root: root })\r\n                  .setDefaultNodeLabel(function(v) { return g.node(v); });\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        parent = g.parent(v);\r\n\r\n    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\r\n      result.setNode(v);\r\n      result.setParent(v, parent || root);\r\n\r\n      // This assumes we have only short edges!\r\n      _.each(g[relationship](v), function(e) {\r\n        var u = e.v === v ? e.w : e.v,\r\n            edge = result.edge(u, v),\r\n            weight = !_.isUndefined(edge) ? edge.weight : 0;\r\n        result.setEdge(u, v, { weight: g.edge(e).weight + weight });\r\n      });\r\n\r\n      if (_.has(node, \"minRank\")) {\r\n        result.setNode(v, {\r\n          borderLeft: node.borderLeft[rank],\r\n          borderRight: node.borderRight[rank]\r\n        });\r\n      }\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\nfunction createRootNode(g) {\r\n  var v;\r\n  while (g.hasNode((v = _.uniqueId(\"_root\"))));\r\n  return v;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10}],16:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = crossCount;\r\n\r\n/*\r\n * A function that takes a layering (an array of layers, each with an array of\r\n * ordererd nodes) and a graph and returns a weighted crossing count.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph must be simple (not a multigraph), directed, and include\r\n *       only simple edges.\r\n *    2. Edges in the input graph must have assigned weights.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. The graph and layering matrix are left unchanged.\r\n *\r\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\r\n */\r\nfunction crossCount(g, layering) {\r\n  var cc = 0;\r\n  for (var i = 1; i < layering.length; ++i) {\r\n    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\r\n  }\r\n  return cc;\r\n}\r\n\r\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\r\n  // Sort all of the edges between the north and south layers by their position\r\n  // in the north layer and then the south. Map these edges to the position of\r\n  // their head in the south layer.\r\n  var southPos = _.zipObject(southLayer,\r\n                             _.map(southLayer, function (v, i) { return i; }));\r\n  var southEntries = _.flatten(_.map(northLayer, function(v) {\r\n    return _.chain(g.outEdges(v))\r\n            .map(function(e) {\r\n              return { pos: southPos[e.w], weight: g.edge(e).weight };\r\n            })\r\n            .sortBy(\"pos\")\r\n            .value();\r\n  }), true);\r\n\r\n  // Build the accumulator tree\r\n  var firstIndex = 1;\r\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\r\n  var treeSize = 2 * firstIndex - 1;\r\n  firstIndex -= 1;\r\n  var tree = _.map(new Array(treeSize), function() { return 0; });\r\n\r\n  // Calculate the weighted crossings\r\n  var cc = 0;\r\n  _.each(southEntries.forEach(function(entry) {\r\n    var index = entry.pos + firstIndex;\r\n    tree[index] += entry.weight;\r\n    var weightSum = 0;\r\n    while (index > 0) {\r\n      if (index % 2) {\r\n        weightSum += tree[index + 1];\r\n      }\r\n      index = (index - 1) >> 1;\r\n      tree[index] += entry.weight;\r\n    }\r\n    cc += entry.weight * weightSum;\r\n  }));\r\n\r\n  return cc;\r\n}\r\n\r\n},{\"../lodash\":10}],17:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    initOrder = require(\"./init-order\"),\r\n    crossCount = require(\"./cross-count\"),\r\n    sortSubgraph = require(\"./sort-subgraph\"),\r\n    buildLayerGraph = require(\"./build-layer-graph\"),\r\n    addSubgraphConstraints = require(\"./add-subgraph-constraints\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = order;\r\n\r\n/*\r\n * Applies heuristics to minimize edge crossings in the graph and sets the best\r\n * order solution as an order attribute on each node.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be DAG\r\n *    2. Graph nodes must be objects with a \"rank\" attribute\r\n *    3. Graph edges must have the \"weight\" attribute\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have an \"order\" attribute based on the results of the\r\n *       algorithm.\r\n */\r\nfunction order(g) {\r\n  var maxRank = util.maxRank(g),\r\n      downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), \"inEdges\"),\r\n      upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), \"outEdges\");\r\n\r\n  var layering = initOrder(g);\r\n  assignOrder(g, layering);\r\n\r\n  var bestCC = Number.POSITIVE_INFINITY,\r\n      best;\r\n\r\n  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\r\n    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\r\n\r\n    layering = util.buildLayerMatrix(g);\r\n    var cc = crossCount(g, layering);\r\n    if (cc < bestCC) {\r\n      lastBest = 0;\r\n      best = _.cloneDeep(layering);\r\n      bestCC = cc;\r\n    }\r\n  }\r\n\r\n  assignOrder(g, best);\r\n}\r\n\r\nfunction buildLayerGraphs(g, ranks, relationship) {\r\n  return _.map(ranks, function(rank) {\r\n    return buildLayerGraph(g, rank, relationship);\r\n  });\r\n}\r\n\r\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\r\n  var cg = new Graph();\r\n  _.each(layerGraphs, function(lg) {\r\n    var root = lg.graph().root;\r\n    var sorted = sortSubgraph(lg, root, cg, biasRight);\r\n    _.each(sorted.vs, function(v, i) {\r\n      lg.node(v).order = i;\r\n    });\r\n    addSubgraphConstraints(lg, cg, sorted.vs);\r\n  });\r\n}\r\n\r\nfunction assignOrder(g, layering) {\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, i) {\r\n      g.node(v).order = i;\r\n    });\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./add-subgraph-constraints\":13,\"./build-layer-graph\":15,\"./cross-count\":16,\"./init-order\":18,\"./sort-subgraph\":20}],18:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = initOrder;\r\n\r\n/*\r\n * Assigns an initial order value for each node by performing a DFS search\r\n * starting from nodes in the first rank. Nodes are assigned an order in their\r\n * rank as they are first visited.\r\n *\r\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\r\n * Graphs.\"\r\n *\r\n * Returns a layering matrix with an array per layer and each layer sorted by\r\n * the order of its nodes.\r\n */\r\nfunction initOrder(g) {\r\n  var visited = {},\r\n      simpleNodes = _.filter(g.nodes(), function(v) {\r\n        return !g.children(v).length;\r\n      }),\r\n      maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })),\r\n      layers = _.map(_.range(maxRank + 1), function() { return []; });\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    var node = g.node(v);\r\n    layers[node.rank].push(v);\r\n    _.each(g.successors(v), dfs);\r\n  }\r\n\r\n  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\r\n  _.each(orderedVs, dfs);\r\n\r\n  return layers;\r\n}\r\n\r\n},{\"../lodash\":10}],19:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = resolveConflicts;\r\n\r\n/*\r\n * Given a list of entries of the form {v, barycenter, weight} and a\r\n * constraint graph this function will resolve any conflicts between the\r\n * constraint graph and the barycenters for the entries. If the barycenters for\r\n * an entry would violate a constraint in the constraint graph then we coalesce\r\n * the nodes in the conflict into a new node that respects the contraint and\r\n * aggregates barycenter and weight information.\r\n *\r\n * This implementation is based on the description in Forster, \"A Fast and\r\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\r\n * differs in some specific details.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Each entry has the form {v, barycenter, weight}, or if the node has\r\n *       no barycenter, then {v}.\r\n *\r\n * Returns:\r\n *\r\n *    A new list of entries of the form {vs, i, barycenter, weight}. The list\r\n *    `vs` may either be a singleton or it may be an aggregation of nodes\r\n *    ordered such that they do not violate constraints from the constraint\r\n *    graph. The property `i` is the lowest original index of any of the\r\n *    elements in `vs`.\r\n */\r\nfunction resolveConflicts(entries, cg) {\r\n  var mappedEntries = {};\r\n  _.each(entries, function(entry, i) {\r\n    var tmp = mappedEntries[entry.v] = {\r\n      indegree: 0,\r\n      \"in\": [],\r\n      out: [],\r\n      vs: [entry.v],\r\n      i: i\r\n    };\r\n    if (!_.isUndefined(entry.barycenter)) {\r\n      tmp.barycenter = entry.barycenter;\r\n      tmp.weight = entry.weight;\r\n    }\r\n  });\r\n\r\n  _.each(cg.edges(), function(e) {\r\n    var entryV = mappedEntries[e.v],\r\n        entryW = mappedEntries[e.w];\r\n    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\r\n      entryW.indegree++;\r\n      entryV.out.push(mappedEntries[e.w]);\r\n    }\r\n  });\r\n\r\n  var sourceSet = _.filter(mappedEntries, function(entry) {\r\n    return !entry.indegree;\r\n  });\r\n\r\n  return doResolveConflicts(sourceSet);\r\n}\r\n\r\nfunction doResolveConflicts(sourceSet) {\r\n  var entries = [];\r\n\r\n  function handleIn(vEntry) {\r\n    return function(uEntry) {\r\n      if (uEntry.merged) {\r\n        return;\r\n      }\r\n      if (_.isUndefined(uEntry.barycenter) ||\r\n          _.isUndefined(vEntry.barycenter) ||\r\n          uEntry.barycenter >= vEntry.barycenter) {\r\n        mergeEntries(vEntry, uEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  function handleOut(vEntry) {\r\n    return function(wEntry) {\r\n      wEntry[\"in\"].push(vEntry);\r\n      if (--wEntry.indegree === 0) {\r\n        sourceSet.push(wEntry);\r\n      }\r\n    };\r\n  }\r\n\r\n  while (sourceSet.length) {\r\n    var entry = sourceSet.pop();\r\n    entries.push(entry);\r\n    _.each(entry[\"in\"].reverse(), handleIn(entry));\r\n    _.each(entry.out, handleOut(entry));\r\n  }\r\n\r\n  return _.chain(entries)\r\n          .filter(function(entry) { return !entry.merged; })\r\n          .map(function(entry) {\r\n            return _.pick(entry, [\"vs\", \"i\", \"barycenter\", \"weight\"]);\r\n          })\r\n          .value();\r\n}\r\n\r\nfunction mergeEntries(target, source) {\r\n  var sum = 0,\r\n      weight = 0;\r\n\r\n  if (target.weight) {\r\n    sum += target.barycenter * target.weight;\r\n    weight += target.weight;\r\n  }\r\n\r\n  if (source.weight) {\r\n    sum += source.barycenter * source.weight;\r\n    weight += source.weight;\r\n  }\r\n\r\n  target.vs = source.vs.concat(target.vs);\r\n  target.barycenter = sum / weight;\r\n  target.weight = weight;\r\n  target.i = Math.min(source.i, target.i);\r\n  source.merged = true;\r\n}\r\n\r\n},{\"../lodash\":10}],20:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    barycenter = require(\"./barycenter\"),\r\n    resolveConflicts = require(\"./resolve-conflicts\"),\r\n    sort = require(\"./sort\");\r\n\r\nmodule.exports = sortSubgraph;\r\n\r\nfunction sortSubgraph(g, v, cg, biasRight) {\r\n  var movable = g.children(v),\r\n      node = g.node(v),\r\n      bl = node ? node.borderLeft : undefined,\r\n      br = node ? node.borderRight: undefined,\r\n      subgraphs = {};\r\n\r\n  if (bl) {\r\n    movable = _.filter(movable, function(w) {\r\n      return w !== bl && w !== br;\r\n    });\r\n  }\r\n\r\n  var barycenters = barycenter(g, movable);\r\n  _.each(barycenters, function(entry) {\r\n    if (g.children(entry.v).length) {\r\n      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\r\n      subgraphs[entry.v] = subgraphResult;\r\n      if (_.has(subgraphResult, \"barycenter\")) {\r\n        mergeBarycenters(entry, subgraphResult);\r\n      }\r\n    }\r\n  });\r\n\r\n  var entries = resolveConflicts(barycenters, cg);\r\n  expandSubgraphs(entries, subgraphs);\r\n\r\n  var result = sort(entries, biasRight);\r\n\r\n  if (bl) {\r\n    result.vs = _.flatten([bl, result.vs, br], true);\r\n    if (g.predecessors(bl).length) {\r\n      var blPred = g.node(g.predecessors(bl)[0]),\r\n          brPred = g.node(g.predecessors(br)[0]);\r\n      if (!_.has(result, \"barycenter\")) {\r\n        result.barycenter = 0;\r\n        result.weight = 0;\r\n      }\r\n      result.barycenter = (result.barycenter * result.weight +\r\n                           blPred.order + brPred.order) / (result.weight + 2);\r\n      result.weight += 2;\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\nfunction expandSubgraphs(entries, subgraphs) {\r\n  _.each(entries, function(entry) {\r\n    entry.vs = _.flatten(entry.vs.map(function(v) {\r\n      if (subgraphs[v]) {\r\n        return subgraphs[v].vs;\r\n      }\r\n      return v;\r\n    }), true);\r\n  });\r\n}\r\n\r\nfunction mergeBarycenters(target, other) {\r\n  if (!_.isUndefined(target.barycenter)) {\r\n    target.barycenter = (target.barycenter * target.weight +\r\n                         other.barycenter * other.weight) /\r\n                        (target.weight + other.weight);\r\n    target.weight += other.weight;\r\n  } else {\r\n    target.barycenter = other.barycenter;\r\n    target.weight = other.weight;\r\n  }\r\n}\r\n\r\n},{\"../lodash\":10,\"./barycenter\":14,\"./resolve-conflicts\":19,\"./sort\":21}],21:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\");\r\n\r\nmodule.exports = sort;\r\n\r\nfunction sort(entries, biasRight) {\r\n  var parts = util.partition(entries, function(entry) {\r\n    return _.has(entry, \"barycenter\");\r\n  });\r\n  var sortable = parts.lhs,\r\n      unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\r\n      vs = [],\r\n      sum = 0,\r\n      weight = 0,\r\n      vsIndex = 0;\r\n\r\n  sortable.sort(compareWithBias(!!biasRight));\r\n\r\n  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n\r\n  _.each(sortable, function (entry) {\r\n    vsIndex += entry.vs.length;\r\n    vs.push(entry.vs);\r\n    sum += entry.barycenter * entry.weight;\r\n    weight += entry.weight;\r\n    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\r\n  });\r\n\r\n  var result = { vs: _.flatten(vs, true) };\r\n  if (weight) {\r\n    result.barycenter = sum / weight;\r\n    result.weight = weight;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction consumeUnsortable(vs, unsortable, index) {\r\n  var last;\r\n  while (unsortable.length && (last = _.last(unsortable)).i <= index) {\r\n    unsortable.pop();\r\n    vs.push(last.vs);\r\n    index++;\r\n  }\r\n  return index;\r\n}\r\n\r\nfunction compareWithBias(bias) {\r\n  return function(entryV, entryW) {\r\n    if (entryV.barycenter < entryW.barycenter) {\r\n      return -1;\r\n    } else if (entryV.barycenter > entryW.barycenter) {\r\n      return 1;\r\n    }\r\n\r\n    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\r\n  };\r\n}\r\n\r\n},{\"../lodash\":10,\"../util\":29}],22:[function(require,module,exports){\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = parentDummyChains;\r\n\r\nfunction parentDummyChains(g) {\r\n  var postorderNums = postorder(g);\r\n\r\n  _.each(g.graph().dummyChains, function(v) {\r\n    var node = g.node(v),\r\n        edgeObj = node.edgeObj,\r\n        pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w),\r\n        path = pathData.path,\r\n        lca = pathData.lca,\r\n        pathIdx = 0,\r\n        pathV = path[pathIdx],\r\n        ascending = true;\r\n\r\n    while (v !== edgeObj.w) {\r\n      node = g.node(v);\r\n\r\n      if (ascending) {\r\n        while ((pathV = path[pathIdx]) !== lca &&\r\n               g.node(pathV).maxRank < node.rank) {\r\n          pathIdx++;\r\n        }\r\n\r\n        if (pathV === lca) {\r\n          ascending = false;\r\n        }\r\n      }\r\n\r\n      if (!ascending) {\r\n        while (pathIdx < path.length - 1 &&\r\n               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\r\n          pathIdx++;\r\n        }\r\n        pathV = path[pathIdx];\r\n      }\r\n\r\n      g.setParent(v, pathV);\r\n      v = g.successors(v)[0];\r\n    }\r\n  });\r\n}\r\n\r\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\r\n// full path and the LCA.\r\nfunction findPath(g, postorderNums, v, w) {\r\n  var vPath = [],\r\n      wPath = [],\r\n      low = Math.min(postorderNums[v].low, postorderNums[w].low),\r\n      lim = Math.max(postorderNums[v].lim, postorderNums[w].lim),\r\n      parent,\r\n      lca;\r\n\r\n  // Traverse up from v to find the LCA\r\n  parent = v;\r\n  do {\r\n    parent = g.parent(parent);\r\n    vPath.push(parent);\r\n  } while (parent &&\r\n           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\r\n  lca = parent;\r\n\r\n  // Traverse from w to LCA\r\n  parent = w;\r\n  while ((parent = g.parent(parent)) !== lca) {\r\n    wPath.push(parent);\r\n  }\r\n\r\n  return { path: vPath.concat(wPath.reverse()), lca: lca };\r\n}\r\n\r\nfunction postorder(g) {\r\n  var result = {},\r\n      lim = 0;\r\n\r\n  function dfs(v) {\r\n    var low = lim;\r\n    _.each(g.children(v), dfs);\r\n    result[v] = { low: low, lim: lim++ };\r\n  }\r\n  _.each(g.children(), dfs);\r\n\r\n  return result;\r\n}\r\n\r\n},{\"./lodash\":10}],23:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    util = require(\"../util\");\r\n\r\n/*\r\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\r\n * and Simple Horizontal Coordinate Assignment.\"\r\n */\r\n\r\nmodule.exports = {\r\n  positionX: positionX,\r\n  findType1Conflicts: findType1Conflicts,\r\n  findType2Conflicts: findType2Conflicts,\r\n  addConflict: addConflict,\r\n  hasConflict: hasConflict,\r\n  verticalAlignment: verticalAlignment,\r\n  horizontalCompaction: horizontalCompaction,\r\n  alignCoordinates: alignCoordinates,\r\n  findSmallestWidthAlignment: findSmallestWidthAlignment,\r\n  balance: balance\r\n};\r\n\r\n/*\r\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\r\n * property. A type-1 conflict is one where a non-inner segment crosses an\r\n * inner segment. An inner segment is an edge with both incident nodes marked\r\n * with the \"dummy\" property.\r\n *\r\n * This algorithm scans layer by layer, starting with the second, for type-1\r\n * conflicts between the current layer and the previous layer. For each layer\r\n * it scans the nodes from left to right until it reaches one that is incident\r\n * on an inner segment. It then scans predecessors to determine if they have\r\n * edges that cross that inner segment. At the end a final scan is done for all\r\n * nodes on the current rank to see if they cross the last visited inner\r\n * segment.\r\n *\r\n * This algorithm (safely) assumes that a dummy node will only be incident on a\r\n * single node in the layers being scanned.\r\n */\r\nfunction findType1Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function visitLayer(prevLayer, layer) {\r\n    var\r\n      // last visited node in the previous layer that is incident on an inner\r\n      // segment.\r\n      k0 = 0,\r\n      // Tracks the last node in this layer scanned for crossings with a type-1\r\n      // segment.\r\n      scanPos = 0,\r\n      prevLayerLength = prevLayer.length,\r\n      lastNode = _.last(layer);\r\n\r\n    _.each(layer, function(v, i) {\r\n      var w = findOtherInnerSegmentNode(g, v),\r\n          k1 = w ? g.node(w).order : prevLayerLength;\r\n\r\n      if (w || v === lastNode) {\r\n        _.each(layer.slice(scanPos, i +1), function(scanNode) {\r\n          _.each(g.predecessors(scanNode), function(u) {\r\n            var uLabel = g.node(u),\r\n                uPos = uLabel.order;\r\n            if ((uPos < k0 || k1 < uPos) &&\r\n                !(uLabel.dummy && g.node(scanNode).dummy)) {\r\n              addConflict(conflicts, u, scanNode);\r\n            }\r\n          });\r\n        });\r\n        scanPos = i + 1;\r\n        k0 = k1;\r\n      }\r\n    });\r\n\r\n    return layer;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findType2Conflicts(g, layering) {\r\n  var conflicts = {};\r\n\r\n  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\r\n    var v;\r\n    _.each(_.range(southPos, southEnd), function(i) {\r\n      v = south[i];\r\n      if (g.node(v).dummy) {\r\n        _.each(g.predecessors(v), function(u) {\r\n          var uNode = g.node(u);\r\n          if (uNode.dummy &&\r\n              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\r\n            addConflict(conflicts, u, v);\r\n          }\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n\r\n  function visitLayer(north, south) {\r\n    var prevNorthPos = -1,\r\n        nextNorthPos,\r\n        southPos = 0;\r\n\r\n    _.each(south, function(v, southLookahead) {\r\n      if (g.node(v).dummy === \"border\") {\r\n        var predecessors = g.predecessors(v);\r\n        if (predecessors.length) {\r\n          nextNorthPos = g.node(predecessors[0]).order;\r\n          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\r\n          southPos = southLookahead;\r\n          prevNorthPos = nextNorthPos;\r\n        }\r\n      }\r\n      scan(south, southPos, south.length, nextNorthPos, north.length);\r\n    });\r\n\r\n    return south;\r\n  }\r\n\r\n  _.reduce(layering, visitLayer);\r\n  return conflicts;\r\n}\r\n\r\nfunction findOtherInnerSegmentNode(g, v) {\r\n  if (g.node(v).dummy) {\r\n    return _.find(g.predecessors(v), function(u) {\r\n      return g.node(u).dummy;\r\n    });\r\n  }\r\n}\r\n\r\nfunction addConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n\r\n  var conflictsV = conflicts[v];\r\n  if (!conflictsV) {\r\n    conflicts[v] = conflictsV = {};\r\n  }\r\n  conflictsV[w] = true;\r\n}\r\n\r\nfunction hasConflict(conflicts, v, w) {\r\n  if (v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return _.has(conflicts[v], w);\r\n}\r\n\r\n/*\r\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\r\n * attempts to align a node with one of its median neighbors. If the edge\r\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\r\n * If a previous node has already formed a block with a node after the node\r\n * we're trying to form a block with, we also ignore that possibility - our\r\n * blocks would be split in that scenario.\r\n */\r\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\r\n  var root = {},\r\n      align = {},\r\n      pos = {};\r\n\r\n  // We cache the position here based on the layering because the graph and\r\n  // layering may be out of sync. The layering matrix is manipulated to\r\n  // generate different extreme alignments.\r\n  _.each(layering, function(layer) {\r\n    _.each(layer, function(v, order) {\r\n      root[v] = v;\r\n      align[v] = v;\r\n      pos[v] = order;\r\n    });\r\n  });\r\n\r\n  _.each(layering, function(layer) {\r\n    var prevIdx = -1;\r\n    _.each(layer, function(v) {\r\n      var ws = neighborFn(v);\r\n      if (ws.length) {\r\n        ws = _.sortBy(ws, function(w) { return pos[w]; });\r\n        var mp = (ws.length - 1) / 2;\r\n        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\r\n          var w = ws[i];\r\n          if (align[v] === v &&\r\n              prevIdx < pos[w] &&\r\n              !hasConflict(conflicts, v, w)) {\r\n            align[w] = v;\r\n            align[v] = root[v] = root[w];\r\n            prevIdx = pos[w];\r\n          }\r\n        }\r\n      }\r\n    });\r\n  });\r\n\r\n  return { root: root, align: align };\r\n}\r\n\r\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\r\n  // This portion of the algorithm differs from BK due to a number of problems.\r\n  // Instead of their algorithm we construct a new block graph and do two\r\n  // sweeps. The first sweep places blocks with the smallest possible\r\n  // coordinates. The second sweep removes unused space by moving blocks to the\r\n  // greatest coordinates without violating separation.\r\n  var xs = {},\r\n      blockG = buildBlockGraph(g, layering, root, reverseSep);\r\n\r\n  // First pass, assign smallest coordinates via DFS\r\n  var visited = {};\r\n  function pass1(v) {\r\n    if (!_.has(visited, v)) {\r\n      visited[v] = true;\r\n      xs[v] = _.reduce(blockG.inEdges(v), function(max, e) {\r\n        pass1(e.v);\r\n        return Math.max(max, xs[e.v] + blockG.edge(e));\r\n      }, 0);\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass1);\r\n\r\n  function pass2(v) {\r\n    if (visited[v] !== 2) {\r\n      visited[v]++;\r\n      var min = _.reduce(blockG.outEdges(v), function(min, e) {\r\n        pass2(e.w);\r\n        return Math.min(min, xs[e.w] - blockG.edge(e));\r\n      }, Number.POSITIVE_INFINITY);\r\n      if (min !== Number.POSITIVE_INFINITY) {\r\n        xs[v] = Math.max(xs[v], min);\r\n      }\r\n    }\r\n  }\r\n  _.each(blockG.nodes(), pass2);\r\n\r\n\r\n  // Assign x coordinates to all nodes\r\n  _.each(align, function(v) {\r\n    xs[v] = xs[root[v]];\r\n  });\r\n\r\n  return xs;\r\n}\r\n\r\n\r\nfunction buildBlockGraph(g, layering, root, reverseSep) {\r\n  var blockGraph = new Graph(),\r\n      graphLabel = g.graph(),\r\n      sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\r\n\r\n  _.each(layering, function(layer) {\r\n    var u;\r\n    _.each(layer, function(v) {\r\n      var vRoot = root[v];\r\n      blockGraph.setNode(vRoot);\r\n      if (u) {\r\n        var uRoot = root[u],\r\n            prevMax = blockGraph.edge(uRoot, vRoot);\r\n        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\r\n      }\r\n      u = v;\r\n    });\r\n  });\r\n\r\n  return blockGraph;\r\n}\r\n\r\n/*\r\n * Returns the alignment that has the smallest width of the given alignments.\r\n */\r\nfunction findSmallestWidthAlignment(g, xss) {\r\n  return _.min(xss, function(xs) {\r\n    var min = _.min(xs, function(x, v) { return x - width(g, v) / 2; }),\r\n        max = _.max(xs, function(x, v) { return x + width(g, v) / 2; });\r\n    return max - min;\r\n  });\r\n}\r\n\r\n/*\r\n * Align the coordinates of each of the layout alignments such that\r\n * left-biased alignments have their minimum coordinate at the same point as\r\n * the minimum coordinate of the smallest width alignment and right-biased\r\n * alignments have their maximum coordinate at the same point as the maximum\r\n * coordinate of the smallest width alignment.\r\n */\r\nfunction alignCoordinates(xss, alignTo) {\r\n  var alignToMin = _.min(alignTo),\r\n      alignToMax = _.max(alignTo);\r\n\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      var alignment = vert + horiz,\r\n          xs = xss[alignment],\r\n          delta;\r\n      if (xs === alignTo) return;\r\n\r\n      delta = horiz === \"l\" ? alignToMin - _.min(xs) : alignToMax - _.max(xs);\r\n\r\n      if (delta) {\r\n        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nfunction balance(xss, align) {\r\n  return _.mapValues(xss.ul, function(ignore, v) {\r\n    if (align) {\r\n      return xss[align.toLowerCase()][v];\r\n    } else {\r\n      var xs = _.sortBy(_.pluck(xss, v));\r\n      return (xs[1] + xs[2]) / 2;\r\n    }\r\n  });\r\n}\r\n\r\nfunction positionX(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      conflicts = _.merge(findType1Conflicts(g, layering),\r\n                          findType2Conflicts(g, layering));\r\n\r\n  var xss = {},\r\n      adjustedLayering;\r\n  _.each([\"u\", \"d\"], function(vert) {\r\n    adjustedLayering = vert === \"u\" ? layering : _.values(layering).reverse();\r\n    _.each([\"l\", \"r\"], function(horiz) {\r\n      if (horiz === \"r\") {\r\n        adjustedLayering = _.map(adjustedLayering, function(inner) {\r\n          return _.values(inner).reverse();\r\n        });\r\n      }\r\n\r\n      var neighborFn = _.bind(vert === \"u\" ? g.predecessors : g.successors, g);\r\n      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\r\n      var xs = horizontalCompaction(g, adjustedLayering,\r\n                                    align.root, align.align,\r\n                                    horiz === \"r\");\r\n      if (horiz === \"r\") {\r\n        xs = _.mapValues(xs, function(x) { return -x; });\r\n      }\r\n      xss[vert + horiz] = xs;\r\n    });\r\n  });\r\n\r\n  var smallestWidth = findSmallestWidthAlignment(g, xss);\r\n  alignCoordinates(xss, smallestWidth);\r\n  return balance(xss, g.graph().align);\r\n}\r\n\r\nfunction sep(nodeSep, edgeSep, reverseSep) {\r\n  return function(g, v, w) {\r\n    var vLabel = g.node(v),\r\n        wLabel = g.node(w),\r\n        sum = 0,\r\n        delta;\r\n\r\n    sum += vLabel.width / 2;\r\n    if (_.has(vLabel, \"labelpos\")) {\r\n      switch (vLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = -vLabel.width / 2; break;\r\n        case \"r\": delta = vLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\r\n    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\r\n\r\n    sum += wLabel.width / 2;\r\n    if (_.has(wLabel, \"labelpos\")) {\r\n      switch (wLabel.labelpos.toLowerCase()) {\r\n        case \"l\": delta = wLabel.width / 2; break;\r\n        case \"r\": delta = -wLabel.width / 2; break;\r\n      }\r\n    }\r\n    if (delta) {\r\n      sum += reverseSep ? delta : -delta;\r\n    }\r\n    delta = 0;\r\n\r\n    return sum;\r\n  };\r\n}\r\n\r\nfunction width(g, v) {\r\n  return g.node(v).width;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29}],24:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    util = require(\"../util\"),\r\n    positionX = require(\"./bk\").positionX;\r\n\r\nmodule.exports = position;\r\n\r\nfunction position(g) {\r\n  g = util.asNonCompoundGraph(g);\r\n\r\n  positionY(g);\r\n  _.each(positionX(g), function(x, v) {\r\n    g.node(v).x = x;\r\n  });\r\n}\r\n\r\nfunction positionY(g) {\r\n  var layering = util.buildLayerMatrix(g),\r\n      rankSep = g.graph().ranksep,\r\n      prevY = 0;\r\n  _.each(layering, function(layer) {\r\n    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\r\n    _.each(layer, function(v) {\r\n      g.node(v).y = prevY + maxHeight / 2;\r\n    });\r\n    prevY += maxHeight + rankSep;\r\n  });\r\n}\r\n\r\n\r\n},{\"../lodash\":10,\"../util\":29,\"./bk\":23}],25:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graphlib\").Graph,\r\n    slack = require(\"./util\").slack;\r\n\r\nmodule.exports = feasibleTree;\r\n\r\n/*\r\n * Constructs a spanning tree with tight edges and adjusted the input node's\r\n * ranks to achieve this. A tight edge is one that is has a length that matches\r\n * its \"minlen\" attribute.\r\n *\r\n * The basic structure for this function is derived from Gansner, et al., \"A\r\n * Technique for Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a DAG.\r\n *    2. Graph must be connected.\r\n *    3. Graph must have at least one node.\r\n *    5. Graph nodes must have been previously assigned a \"rank\" property that\r\n *       respects the \"minlen\" property of incident edges.\r\n *    6. Graph edges must have a \"minlen\" property.\r\n *\r\n * Post-conditions:\r\n *\r\n *    - Graph nodes will have their rank adjusted to ensure that all edges are\r\n *      tight.\r\n *\r\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\r\n * edges.\r\n */\r\nfunction feasibleTree(g) {\r\n  var t = new Graph({ directed: false });\r\n\r\n  // Choose arbitrary node from which to start our tree\r\n  var start = g.nodes()[0],\r\n      size = g.nodeCount();\r\n  t.setNode(start, {});\r\n\r\n  var edge, delta;\r\n  while (tightTree(t, g) < size) {\r\n    edge = findMinSlackEdge(t, g);\r\n    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\r\n    shiftRanks(t, g, delta);\r\n  }\r\n\r\n  return t;\r\n}\r\n\r\n/*\r\n * Finds a maximal tree of tight edges and returns the number of nodes in the\r\n * tree.\r\n */\r\nfunction tightTree(t, g) {\r\n  function dfs(v) {\r\n    _.each(g.nodeEdges(v), function(e) {\r\n      var edgeV = e.v,\r\n          w = (v === edgeV) ? e.w : edgeV;\r\n      if (!t.hasNode(w) && !slack(g, e)) {\r\n        t.setNode(w, {});\r\n        t.setEdge(v, w, {});\r\n        dfs(w);\r\n      }\r\n    });\r\n  }\r\n\r\n  _.each(t.nodes(), dfs);\r\n  return t.nodeCount();\r\n}\r\n\r\n/*\r\n * Finds the edge with the smallest slack that is incident on tree and returns\r\n * it.\r\n */\r\nfunction findMinSlackEdge(t, g) {\r\n  return _.min(g.edges(), function(e) {\r\n    if (t.hasNode(e.v) !== t.hasNode(e.w)) {\r\n      return slack(g, e);\r\n    }\r\n  });\r\n}\r\n\r\nfunction shiftRanks(t, g, delta) {\r\n  _.each(t.nodes(), function(v) {\r\n    g.node(v).rank += delta;\r\n  });\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"./util\":28}],26:[function(require,module,exports){\r\n\r\n\r\nvar rankUtil = require(\"./util\"),\r\n    longestPath = rankUtil.longestPath,\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    networkSimplex = require(\"./network-simplex\");\r\n\r\nmodule.exports = rank;\r\n\r\n/*\r\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\r\n * constraint specified on edges between nodes.\r\n *\r\n * This basic structure is derived from Gansner, et al., \"A Technique for\r\n * Drawing Directed Graphs.\"\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Graph must be a connected DAG\r\n *    2. Graph nodes must be objects\r\n *    3. Graph edges must have \"weight\" and \"minlen\" attributes\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Graph nodes will have a \"rank\" attribute based on the results of the\r\n *       algorithm. Ranks can start at any index (including negative), we'll\r\n *       fix them up later.\r\n */\r\nfunction rank(g) {\r\n  switch(g.graph().ranker) {\r\n    case \"network-simplex\": networkSimplexRanker(g); break;\r\n    case \"tight-tree\": tightTreeRanker(g); break;\r\n    case \"longest-path\": longestPathRanker(g); break;\r\n    default: networkSimplexRanker(g);\r\n  }\r\n}\r\n\r\n// A fast and simple ranker, but results are far from optimal.\r\nvar longestPathRanker = longestPath;\r\n\r\nfunction tightTreeRanker(g) {\r\n  longestPath(g);\r\n  feasibleTree(g);\r\n}\r\n\r\nfunction networkSimplexRanker(g) {\r\n  networkSimplex(g);\r\n}\r\n\r\n},{\"./feasible-tree\":25,\"./network-simplex\":27,\"./util\":28}],27:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\"),\r\n    feasibleTree = require(\"./feasible-tree\"),\r\n    slack = require(\"./util\").slack,\r\n    initRank = require(\"./util\").longestPath,\r\n    preorder = require(\"../graphlib\").alg.preorder,\r\n    postorder = require(\"../graphlib\").alg.postorder,\r\n    simplify = require(\"../util\").simplify;\r\n\r\nmodule.exports = networkSimplex;\r\n\r\n// Expose some internals for testing purposes\r\nnetworkSimplex.initLowLimValues = initLowLimValues;\r\nnetworkSimplex.initCutValues = initCutValues;\r\nnetworkSimplex.calcCutValue = calcCutValue;\r\nnetworkSimplex.leaveEdge = leaveEdge;\r\nnetworkSimplex.enterEdge = enterEdge;\r\nnetworkSimplex.exchangeEdges = exchangeEdges;\r\n\r\n/*\r\n * The network simplex algorithm assigns ranks to each node in the input graph\r\n * and iteratively improves the ranking to reduce the length of edges.\r\n *\r\n * Preconditions:\r\n *\r\n *    1. The input graph must be a DAG.\r\n *    2. All nodes in the graph must have an object value.\r\n *    3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\r\n *\r\n * Postconditions:\r\n *\r\n *    1. All nodes in the graph will have an assigned \"rank\" attribute that has\r\n *       been optimized by the network simplex algorithm. Ranks start at 0.\r\n *\r\n *\r\n * A rough sketch of the algorithm is as follows:\r\n *\r\n *    1. Assign initial ranks to each node. We use the longest path algorithm,\r\n *       which assigns ranks to the lowest position possible. In general this\r\n *       leads to very wide bottom ranks and unnecessarily long edges.\r\n *    2. Construct a feasible tight tree. A tight tree is one such that all\r\n *       edges in the tree have no slack (difference between length of edge\r\n *       and minlen for the edge). This by itself greatly improves the assigned\r\n *       rankings by shorting edges.\r\n *    3. Iteratively find edges that have negative cut values. Generally a\r\n *       negative cut value indicates that the edge could be removed and a new\r\n *       tree edge could be added to produce a more compact graph.\r\n *\r\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\r\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\r\n * structure of the overall algorithm.\r\n */\r\nfunction networkSimplex(g) {\r\n  g = simplify(g);\r\n  initRank(g);\r\n  var t = feasibleTree(g);\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n\r\n  var e, f;\r\n  while ((e = leaveEdge(t))) {\r\n    f = enterEdge(t, g, e);\r\n    exchangeEdges(t, g, e, f);\r\n  }\r\n}\r\n\r\n/*\r\n * Initializes cut values for all edges in the tree.\r\n */\r\nfunction initCutValues(t, g) {\r\n  var vs = postorder(t, t.nodes());\r\n  vs = vs.slice(0, vs.length - 1);\r\n  _.each(vs, function(v) {\r\n    assignCutValue(t, g, v);\r\n  });\r\n}\r\n\r\nfunction assignCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent;\r\n  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\r\n}\r\n\r\n/*\r\n * Given the tight tree, its graph, and a child in the graph calculate and\r\n * return the cut value for the edge between the child and its parent.\r\n */\r\nfunction calcCutValue(t, g, child) {\r\n  var childLab = t.node(child),\r\n      parent = childLab.parent,\r\n      // True if the child is on the tail end of the edge in the directed graph\r\n      childIsTail = true,\r\n      // The graph's view of the tree edge we're inspecting\r\n      graphEdge = g.edge(child, parent),\r\n      // The accumulated cut value for the edge between this node and its parent\r\n      cutValue = 0;\r\n\r\n  if (!graphEdge) {\r\n    childIsTail = false;\r\n    graphEdge = g.edge(parent, child);\r\n  }\r\n\r\n  cutValue = graphEdge.weight;\r\n\r\n  _.each(g.nodeEdges(child), function(e) {\r\n    var isOutEdge = e.v === child,\r\n        other = isOutEdge ? e.w : e.v;\r\n\r\n    if (other !== parent) {\r\n      var pointsToHead = isOutEdge === childIsTail,\r\n          otherWeight = g.edge(e).weight;\r\n\r\n      cutValue += pointsToHead ? otherWeight : -otherWeight;\r\n      if (isTreeEdge(t, child, other)) {\r\n        var otherCutValue = t.edge(child, other).cutvalue;\r\n        cutValue += pointsToHead ? -otherCutValue : otherCutValue;\r\n      }\r\n    }\r\n  });\r\n\r\n  return cutValue;\r\n}\r\n\r\nfunction initLowLimValues(tree, root) {\r\n  if (arguments.length < 2) {\r\n    root = tree.nodes()[0];\r\n  }\r\n  dfsAssignLowLim(tree, {}, 1, root);\r\n}\r\n\r\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\r\n  var low = nextLim,\r\n      label = tree.node(v);\r\n\r\n  visited[v] = true;\r\n  _.each(tree.neighbors(v), function(w) {\r\n    if (!_.has(visited, w)) {\r\n      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\r\n    }\r\n  });\r\n\r\n  label.low = low;\r\n  label.lim = nextLim++;\r\n  if (parent) {\r\n    label.parent = parent;\r\n  } else {\r\n    // TODO should be able to remove this when we incrementally update low lim\r\n    delete label.parent;\r\n  }\r\n\r\n  return nextLim;\r\n}\r\n\r\nfunction leaveEdge(tree) {\r\n  return _.find(tree.edges(), function(e) {\r\n    return tree.edge(e).cutvalue < 0;\r\n  });\r\n}\r\n\r\nfunction enterEdge(t, g, edge) {\r\n  var v = edge.v,\r\n      w = edge.w;\r\n\r\n  // For the rest of this function we assume that v is the tail and w is the\r\n  // head, so if we don't have this edge in the graph we should flip it to\r\n  // match the correct orientation.\r\n  if (!g.hasEdge(v, w)) {\r\n    v = edge.w;\r\n    w = edge.v;\r\n  }\r\n\r\n  var vLabel = t.node(v),\r\n      wLabel = t.node(w),\r\n      tailLabel = vLabel,\r\n      flip = false;\r\n\r\n  // If the root is in the tail of the edge then we need to flip the logic that\r\n  // checks for the head and tail nodes in the candidates function below.\r\n  if (vLabel.lim > wLabel.lim) {\r\n    tailLabel = wLabel;\r\n    flip = true;\r\n  }\r\n\r\n  var candidates = _.filter(g.edges(), function(edge) {\r\n    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\r\n           flip !== isDescendant(t, t.node(edge.w), tailLabel);\r\n  });\r\n\r\n  return _.min(candidates, function(edge) { return slack(g, edge); });\r\n}\r\n\r\nfunction exchangeEdges(t, g, e, f) {\r\n  var v = e.v,\r\n      w = e.w;\r\n  t.removeEdge(v, w);\r\n  t.setEdge(f.v, f.w, {});\r\n  initLowLimValues(t);\r\n  initCutValues(t, g);\r\n  updateRanks(t, g);\r\n}\r\n\r\nfunction updateRanks(t, g) {\r\n  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }),\r\n      vs = preorder(t, root);\r\n  vs = vs.slice(1);\r\n  _.each(vs, function(v) {\r\n    var parent = t.node(v).parent,\r\n        edge = g.edge(v, parent),\r\n        flipped = false;\r\n\r\n    if (!edge) {\r\n      edge = g.edge(parent, v);\r\n      flipped = true;\r\n    }\r\n\r\n    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\r\n  });\r\n}\r\n\r\n/*\r\n * Returns true if the edge is in the tree.\r\n */\r\nfunction isTreeEdge(tree, u, v) {\r\n  return tree.hasEdge(u, v);\r\n}\r\n\r\n/*\r\n * Returns true if the specified node is descendant of the root node per the\r\n * assigned low and lim attributes in the tree.\r\n */\r\nfunction isDescendant(tree, vLabel, rootLabel) {\r\n  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\r\n}\r\n\r\n},{\"../graphlib\":7,\"../lodash\":10,\"../util\":29,\"./feasible-tree\":25,\"./util\":28}],28:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = {\r\n  longestPath: longestPath,\r\n  slack: slack\r\n};\r\n\r\n/*\r\n * Initializes ranks for the input graph using the longest path algorithm. This\r\n * algorithm scales well and is fast in practice, it yields rather poor\r\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\r\n * ranks wide and leaving edges longer than necessary. However, due to its\r\n * speed, this algorithm is good for getting an initial ranking that can be fed\r\n * into other algorithms.\r\n *\r\n * This algorithm does not normalize layers because it will be used by other\r\n * algorithms in most cases. If using this algorithm directly, be sure to\r\n * run normalize at the end.\r\n *\r\n * Pre-conditions:\r\n *\r\n *    1. Input graph is a DAG.\r\n *    2. Input graph node labels can be assigned properties.\r\n *\r\n * Post-conditions:\r\n *\r\n *    1. Each node will be assign an (unnormalized) \"rank\" property.\r\n */\r\nfunction longestPath(g) {\r\n  var visited = {};\r\n\r\n  function dfs(v) {\r\n    var label = g.node(v);\r\n    if (_.has(visited, v)) {\r\n      return label.rank;\r\n    }\r\n    visited[v] = true;\r\n\r\n    var rank = _.min(_.map(g.outEdges(v), function(e) {\r\n      return dfs(e.w) - g.edge(e).minlen;\r\n    }));\r\n\r\n    if (rank === Number.POSITIVE_INFINITY) {\r\n      rank = 0;\r\n    }\r\n\r\n    return (label.rank = rank);\r\n  }\r\n\r\n  _.each(g.sources(), dfs);\r\n}\r\n\r\n/*\r\n * Returns the amount of slack for the given edge. The slack is defined as the\r\n * difference between the length of the edge and its minimum length.\r\n */\r\nfunction slack(g, e) {\r\n  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\r\n}\r\n\r\n},{\"../lodash\":10}],29:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graphlib\").Graph;\r\n\r\nmodule.exports = {\r\n  addDummyNode: addDummyNode,\r\n  simplify: simplify,\r\n  asNonCompoundGraph: asNonCompoundGraph,\r\n  successorWeights: successorWeights,\r\n  predecessorWeights: predecessorWeights,\r\n  intersectRect: intersectRect,\r\n  buildLayerMatrix: buildLayerMatrix,\r\n  normalizeRanks: normalizeRanks,\r\n  removeEmptyRanks: removeEmptyRanks,\r\n  addBorderNode: addBorderNode,\r\n  maxRank: maxRank,\r\n  partition: partition,\r\n  time: time,\r\n  notime: notime\r\n};\r\n\r\n/*\r\n * Adds a dummy node to the graph and return v.\r\n */\r\nfunction addDummyNode(g, type, attrs, name) {\r\n  var v;\r\n  do {\r\n    v = _.uniqueId(name);\r\n  } while (g.hasNode(v));\r\n\r\n  attrs.dummy = type;\r\n  g.setNode(v, attrs);\r\n  return v;\r\n}\r\n\r\n/*\r\n * Returns a new graph with only simple edges. Handles aggregation of data\r\n * associated with multi-edges.\r\n */\r\nfunction simplify(g) {\r\n  var simplified = new Graph().setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\r\n  _.each(g.edges(), function(e) {\r\n    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 },\r\n        label = g.edge(e);\r\n    simplified.setEdge(e.v, e.w, {\r\n      weight: simpleLabel.weight + label.weight,\r\n      minlen: Math.max(simpleLabel.minlen, label.minlen)\r\n    });\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction asNonCompoundGraph(g) {\r\n  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\r\n  _.each(g.nodes(), function(v) {\r\n    if (!g.children(v).length) {\r\n      simplified.setNode(v, g.node(v));\r\n    }\r\n  });\r\n  _.each(g.edges(), function(e) {\r\n    simplified.setEdge(e, g.edge(e));\r\n  });\r\n  return simplified;\r\n}\r\n\r\nfunction successorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var sucs = {};\r\n    _.each(g.outEdges(v), function(e) {\r\n      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\r\n    });\r\n    return sucs;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\nfunction predecessorWeights(g) {\r\n  var weightMap = _.map(g.nodes(), function(v) {\r\n    var preds = {};\r\n    _.each(g.inEdges(v), function(e) {\r\n      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\r\n    });\r\n    return preds;\r\n  });\r\n  return _.zipObject(g.nodes(), weightMap);\r\n}\r\n\r\n/*\r\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\r\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\r\n */\r\nfunction intersectRect(rect, point) {\r\n  var x = rect.x;\r\n  var y = rect.y;\r\n\r\n  // Rectangle intersection algorithm from:\r\n  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\r\n  var dx = point.x - x;\r\n  var dy = point.y - y;\r\n  var w = rect.width / 2;\r\n  var h = rect.height / 2;\r\n\r\n  if (!dx && !dy) {\r\n    throw new Error(\"Not possible to find intersection inside of the rectangle\");\r\n  }\r\n\r\n  var sx, sy;\r\n  if (Math.abs(dy) * w > Math.abs(dx) * h) {\r\n    // Intersection is top or bottom of rect.\r\n    if (dy < 0) {\r\n      h = -h;\r\n    }\r\n    sx = h * dx / dy;\r\n    sy = h;\r\n  } else {\r\n    // Intersection is left or right of rect.\r\n    if (dx < 0) {\r\n      w = -w;\r\n    }\r\n    sx = w;\r\n    sy = w * dy / dx;\r\n  }\r\n\r\n  return { x: x + sx, y: y + sy };\r\n}\r\n\r\n/*\r\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\r\n * function will produce a matrix with the ids of each node.\r\n */\r\nfunction buildLayerMatrix(g) {\r\n  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v),\r\n        rank = node.rank;\r\n    if (!_.isUndefined(rank)) {\r\n      layering[rank][node.order] = v;\r\n    }\r\n  });\r\n  return layering;\r\n}\r\n\r\n/*\r\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\r\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\r\n */\r\nfunction normalizeRanks(g) {\r\n  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n  _.each(g.nodes(), function(v) {\r\n    var node = g.node(v);\r\n    if (_.has(node, \"rank\")) {\r\n      node.rank -= min;\r\n    }\r\n  });\r\n}\r\n\r\nfunction removeEmptyRanks(g) {\r\n  // Ranks may not start at 0, so we need to offset them\r\n  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\r\n\r\n  var layers = [];\r\n  _.each(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank - offset;\r\n    if (!_.has(layers, rank)) {\r\n      layers[rank] = [];\r\n    }\r\n    layers[rank].push(v);\r\n  });\r\n\r\n  var delta = 0,\r\n      nodeRankFactor = g.graph().nodeRankFactor;\r\n  _.each(layers, function(vs, i) {\r\n    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\r\n      --delta;\r\n    } else if (delta) {\r\n      _.each(vs, function(v) { g.node(v).rank += delta; });\r\n    }\r\n  });\r\n}\r\n\r\nfunction addBorderNode(g, prefix, rank, order) {\r\n  var node = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  if (arguments.length >= 4) {\r\n    node.rank = rank;\r\n    node.order = order;\r\n  }\r\n  return addDummyNode(g, \"border\", node, prefix);\r\n}\r\n\r\nfunction maxRank(g) {\r\n  return _.max(_.map(g.nodes(), function(v) {\r\n    var rank = g.node(v).rank;\r\n    if (!_.isUndefined(rank)) {\r\n      return rank;\r\n    }\r\n  }));\r\n}\r\n\r\n/*\r\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\r\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\r\n * into `rhs.\r\n */\r\nfunction partition(collection, fn) {\r\n  var result = { lhs: [], rhs: [] };\r\n  _.each(collection, function(value) {\r\n    if (fn(value)) {\r\n      result.lhs.push(value);\r\n    } else {\r\n      result.rhs.push(value);\r\n    }\r\n  });\r\n  return result;\r\n}\r\n\r\n/*\r\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\r\n * time it takes to execute the function.\r\n */\r\nfunction time(name, fn) {\r\n  var start = _.now();\r\n  try {\r\n    return fn();\r\n  } finally {\r\n    console.log(name + \" time: \" + (_.now() - start) + \"ms\");\r\n  }\r\n}\r\n\r\nfunction notime(name, fn) {\r\n  return fn();\r\n}\r\n\r\n},{\"./graphlib\":7,\"./lodash\":10}],30:[function(require,module,exports){\r\nmodule.exports = \"0.7.1\";\r\n\r\n},{}],31:[function(require,module,exports){\r\n/**\r\n * Copyright (c) 2014, Chris Pettitt\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n * may be used to endorse or promote products derived from this software without\r\n * specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nvar lib = require(\"./lib\");\r\n\r\nmodule.exports = {\r\n  Graph: lib.Graph,\r\n  json: require(\"./lib/json\"),\r\n  alg: require(\"./lib/alg\"),\r\n  version: lib.version\r\n};\r\n\r\n},{\"./lib\":47,\"./lib/alg\":38,\"./lib/json\":48}],32:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = components;\r\n\r\nfunction components(g) {\r\n  var visited = {},\r\n      cmpts = [],\r\n      cmpt;\r\n\r\n  function dfs(v) {\r\n    if (_.has(visited, v)) return;\r\n    visited[v] = true;\r\n    cmpt.push(v);\r\n    _.each(g.successors(v), dfs);\r\n    _.each(g.predecessors(v), dfs);\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    cmpt = [];\r\n    dfs(v);\r\n    if (cmpt.length) {\r\n      cmpts.push(cmpt);\r\n    }\r\n  });\r\n\r\n  return cmpts;\r\n}\r\n\r\n},{\"../lodash\":49}],33:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = dfs;\r\n\r\n/*\r\n * A helper that preforms a pre- or post-order traversal on the input graph\r\n * and returns the nodes in the order they were visited. This algorithm treats\r\n * the input as undirected.\r\n *\r\n * Order must be one of \"pre\" or \"post\".\r\n */\r\nfunction dfs(g, vs, order) {\r\n  if (!_.isArray(vs)) {\r\n    vs = [vs];\r\n  }\r\n\r\n  var acc = [],\r\n      visited = {};\r\n  _.each(vs, function(v) {\r\n    if (!g.hasNode(v)) {\r\n      throw new Error(\"Graph does not have node: \" + v);\r\n    }\r\n\r\n    doDfs(g, v, order === \"post\", visited, acc);\r\n  });\r\n  return acc;\r\n}\r\n\r\nfunction doDfs(g, v, postorder, visited, acc) {\r\n  if (!_.has(visited, v)) {\r\n    visited[v] = true;\r\n\r\n    if (!postorder) { acc.push(v); }\r\n    _.each(g.neighbors(v), function(w) {\r\n      doDfs(g, w, postorder, visited, acc);\r\n    });\r\n    if (postorder) { acc.push(v); }\r\n  }\r\n}\r\n\r\n},{\"../lodash\":49}],34:[function(require,module,exports){\r\nvar dijkstra = require(\"./dijkstra\"),\r\n    _ = require(\"../lodash\");\r\n\r\nmodule.exports = dijkstraAll;\r\n\r\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\r\n  return _.transform(g.nodes(), function(acc, v) {\r\n    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\r\n  }, {});\r\n}\r\n\r\n},{\"../lodash\":49,\"./dijkstra\":35}],35:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = dijkstra;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction dijkstra(g, source, weightFn, edgeFn) {\r\n  return runDijkstra(g, String(source),\r\n                     weightFn || DEFAULT_WEIGHT_FUNC,\r\n                     edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runDijkstra(g, source, weightFn, edgeFn) {\r\n  var results = {},\r\n      pq = new PriorityQueue(),\r\n      v, vEntry;\r\n\r\n  var updateNeighbors = function(edge) {\r\n    var w = edge.v !== v ? edge.v : edge.w,\r\n        wEntry = results[w],\r\n        weight = weightFn(edge),\r\n        distance = vEntry.distance + weight;\r\n\r\n    if (weight < 0) {\r\n      throw new Error(\"dijkstra does not allow negative edge weights. \" +\r\n                      \"Bad edge: \" + edge + \" Weight: \" + weight);\r\n    }\r\n\r\n    if (distance < wEntry.distance) {\r\n      wEntry.distance = distance;\r\n      wEntry.predecessor = v;\r\n      pq.decrease(w, distance);\r\n    }\r\n  };\r\n\r\n  g.nodes().forEach(function(v) {\r\n    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\r\n    results[v] = { distance: distance };\r\n    pq.add(v, distance);\r\n  });\r\n\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    vEntry = results[v];\r\n    if (vEntry.distance === Number.POSITIVE_INFINITY) {\r\n      break;\r\n    }\r\n\r\n    edgeFn(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../lodash\":49}],36:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    tarjan = require(\"./tarjan\");\r\n\r\nmodule.exports = findCycles;\r\n\r\nfunction findCycles(g) {\r\n  return _.filter(tarjan(g), function(cmpt) { return cmpt.length > 1; });\r\n}\r\n\r\n},{\"../lodash\":49,\"./tarjan\":43}],37:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = floydWarshall;\r\n\r\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\r\n\r\nfunction floydWarshall(g, weightFn, edgeFn) {\r\n  return runFloydWarshall(g,\r\n                          weightFn || DEFAULT_WEIGHT_FUNC,\r\n                          edgeFn || function(v) { return g.outEdges(v); });\r\n}\r\n\r\nfunction runFloydWarshall(g, weightFn, edgeFn) {\r\n  var results = {},\r\n      nodes = g.nodes();\r\n\r\n  nodes.forEach(function(v) {\r\n    results[v] = {};\r\n    results[v][v] = { distance: 0 };\r\n    nodes.forEach(function(w) {\r\n      if (v !== w) {\r\n        results[v][w] = { distance: Number.POSITIVE_INFINITY };\r\n      }\r\n    });\r\n    edgeFn(v).forEach(function(edge) {\r\n      var w = edge.v === v ? edge.w : edge.v,\r\n          d = weightFn(edge);\r\n      results[v][w] = { distance: d, predecessor: v };\r\n    });\r\n  });\r\n\r\n  nodes.forEach(function(k) {\r\n    var rowK = results[k];\r\n    nodes.forEach(function(i) {\r\n      var rowI = results[i];\r\n      nodes.forEach(function(j) {\r\n        var ik = rowI[k];\r\n        var kj = rowK[j];\r\n        var ij = rowI[j];\r\n        var altDistance = ik.distance + kj.distance;\r\n        if (altDistance < ij.distance) {\r\n          ij.distance = altDistance;\r\n          ij.predecessor = kj.predecessor;\r\n        }\r\n      });\r\n    });\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],38:[function(require,module,exports){\r\nmodule.exports = {\r\n  components: require(\"./components\"),\r\n  dijkstra: require(\"./dijkstra\"),\r\n  dijkstraAll: require(\"./dijkstra-all\"),\r\n  findCycles: require(\"./find-cycles\"),\r\n  floydWarshall: require(\"./floyd-warshall\"),\r\n  isAcyclic: require(\"./is-acyclic\"),\r\n  postorder: require(\"./postorder\"),\r\n  preorder: require(\"./preorder\"),\r\n  prim: require(\"./prim\"),\r\n  tarjan: require(\"./tarjan\"),\r\n  topsort: require(\"./topsort\")\r\n};\r\n\r\n},{\"./components\":32,\"./dijkstra\":35,\"./dijkstra-all\":34,\"./find-cycles\":36,\"./floyd-warshall\":37,\"./is-acyclic\":39,\"./postorder\":40,\"./preorder\":41,\"./prim\":42,\"./tarjan\":43,\"./topsort\":44}],39:[function(require,module,exports){\r\nvar topsort = require(\"./topsort\");\r\n\r\nmodule.exports = isAcyclic;\r\n\r\nfunction isAcyclic(g) {\r\n  try {\r\n    topsort(g);\r\n  } catch (e) {\r\n    if (e instanceof topsort.CycleException) {\r\n      return false;\r\n    }\r\n    throw e;\r\n  }\r\n  return true;\r\n}\r\n\r\n},{\"./topsort\":44}],40:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = postorder;\r\n\r\nfunction postorder(g, vs) {\r\n  return dfs(g, vs, \"post\");\r\n}\r\n\r\n},{\"./dfs\":33}],41:[function(require,module,exports){\r\nvar dfs = require(\"./dfs\");\r\n\r\nmodule.exports = preorder;\r\n\r\nfunction preorder(g, vs) {\r\n  return dfs(g, vs, \"pre\");\r\n}\r\n\r\n},{\"./dfs\":33}],42:[function(require,module,exports){\r\nvar _ = require(\"../lodash\"),\r\n    Graph = require(\"../graph\"),\r\n    PriorityQueue = require(\"../data/priority-queue\");\r\n\r\nmodule.exports = prim;\r\n\r\nfunction prim(g, weightFunc) {\r\n  var result = new Graph(),\r\n      parents = {},\r\n      pq = new PriorityQueue(),\r\n      v;\r\n\r\n  function updateNeighbors(edge) {\r\n    var w = edge.v === v ? edge.w : edge.v,\r\n        pri = pq.priority(w);\r\n    if (pri !== undefined) {\r\n      var edgeWeight = weightFunc(edge);\r\n      if (edgeWeight < pri) {\r\n        parents[w] = v;\r\n        pq.decrease(w, edgeWeight);\r\n      }\r\n    }\r\n  }\r\n\r\n  if (g.nodeCount() === 0) {\r\n    return result;\r\n  }\r\n\r\n  _.each(g.nodes(), function(v) {\r\n    pq.add(v, Number.POSITIVE_INFINITY);\r\n    result.setNode(v);\r\n  });\r\n\r\n  // Start from an arbitrary node\r\n  pq.decrease(g.nodes()[0], 0);\r\n\r\n  var init = false;\r\n  while (pq.size() > 0) {\r\n    v = pq.removeMin();\r\n    if (_.has(parents, v)) {\r\n      result.setEdge(v, parents[v]);\r\n    } else if (init) {\r\n      throw new Error(\"Input graph is not connected: \" + g);\r\n    } else {\r\n      init = true;\r\n    }\r\n\r\n    g.nodeEdges(v).forEach(updateNeighbors);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\n},{\"../data/priority-queue\":45,\"../graph\":46,\"../lodash\":49}],43:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = tarjan;\r\n\r\nfunction tarjan(g) {\r\n  var index = 0,\r\n      stack = [],\r\n      visited = {}, // node id -> { onStack, lowlink, index }\r\n      results = [];\r\n\r\n  function dfs(v) {\r\n    var entry = visited[v] = {\r\n      onStack: true,\r\n      lowlink: index,\r\n      index: index++\r\n    };\r\n    stack.push(v);\r\n\r\n    g.successors(v).forEach(function(w) {\r\n      if (!_.has(visited, w)) {\r\n        dfs(w);\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\r\n      } else if (visited[w].onStack) {\r\n        entry.lowlink = Math.min(entry.lowlink, visited[w].index);\r\n      }\r\n    });\r\n\r\n    if (entry.lowlink === entry.index) {\r\n      var cmpt = [],\r\n          w;\r\n      do {\r\n        w = stack.pop();\r\n        visited[w].onStack = false;\r\n        cmpt.push(w);\r\n      } while (v !== w);\r\n      results.push(cmpt);\r\n    }\r\n  }\r\n\r\n  g.nodes().forEach(function(v) {\r\n    if (!_.has(visited, v)) {\r\n      dfs(v);\r\n    }\r\n  });\r\n\r\n  return results;\r\n}\r\n\r\n},{\"../lodash\":49}],44:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = topsort;\r\ntopsort.CycleException = CycleException;\r\n\r\nfunction topsort(g) {\r\n  var visited = {},\r\n      stack = {},\r\n      results = [];\r\n\r\n  function visit(node) {\r\n    if (_.has(stack, node)) {\r\n      throw new CycleException();\r\n    }\r\n\r\n    if (!_.has(visited, node)) {\r\n      stack[node] = true;\r\n      visited[node] = true;\r\n      _.each(g.predecessors(node), visit);\r\n      delete stack[node];\r\n      results.push(node);\r\n    }\r\n  }\r\n\r\n  _.each(g.sinks(), visit);\r\n\r\n  if (_.size(visited) !== g.nodeCount()) {\r\n    throw new CycleException();\r\n  }\r\n\r\n  return results;\r\n}\r\n\r\nfunction CycleException() {}\r\n\r\n},{\"../lodash\":49}],45:[function(require,module,exports){\r\nvar _ = require(\"../lodash\");\r\n\r\nmodule.exports = PriorityQueue;\r\n\r\n/**\r\n * A min-priority queue data structure. This algorithm is derived from Cormen,\r\n * et al., \"Introduction to Algorithms\". The basic idea of a min-priority\r\n * queue is that you can efficiently (in O(1) time) get the smallest key in\r\n * the queue. Adding and removing elements takes O(log n) time. A key can\r\n * have its priority decreased in O(log n) time.\r\n */\r\nfunction PriorityQueue() {\r\n  this._arr = [];\r\n  this._keyIndices = {};\r\n}\r\n\r\n/**\r\n * Returns the number of elements in the queue. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.size = function() {\r\n  return this._arr.length;\r\n};\r\n\r\n/**\r\n * Returns the keys that are in the queue. Takes `O(n)` time.\r\n */\r\nPriorityQueue.prototype.keys = function() {\r\n  return this._arr.map(function(x) { return x.key; });\r\n};\r\n\r\n/**\r\n * Returns `true` if **key** is in the queue and `false` if not.\r\n */\r\nPriorityQueue.prototype.has = function(key) {\r\n  return _.has(this._keyIndices, key);\r\n};\r\n\r\n/**\r\n * Returns the priority for **key**. If **key** is not present in the queue\r\n * then this function returns `undefined`. Takes `O(1)` time.\r\n *\r\n * @param {Object} key\r\n */\r\nPriorityQueue.prototype.priority = function(key) {\r\n  var index = this._keyIndices[key];\r\n  if (index !== undefined) {\r\n    return this._arr[index].priority;\r\n  }\r\n};\r\n\r\n/**\r\n * Returns the key for the minimum element in this queue. If the queue is\r\n * empty this function throws an Error. Takes `O(1)` time.\r\n */\r\nPriorityQueue.prototype.min = function() {\r\n  if (this.size() === 0) {\r\n    throw new Error(\"Queue underflow\");\r\n  }\r\n  return this._arr[0].key;\r\n};\r\n\r\n/**\r\n * Inserts a new key into the priority queue. If the key already exists in\r\n * the queue this function returns `false`; otherwise it will return `true`.\r\n * Takes `O(n)` time.\r\n *\r\n * @param {Object} key the key to add\r\n * @param {Number} priority the initial priority for the key\r\n */\r\nPriorityQueue.prototype.add = function(key, priority) {\r\n  var keyIndices = this._keyIndices;\r\n  key = String(key);\r\n  if (!_.has(keyIndices, key)) {\r\n    var arr = this._arr;\r\n    var index = arr.length;\r\n    keyIndices[key] = index;\r\n    arr.push({key: key, priority: priority});\r\n    this._decrease(index);\r\n    return true;\r\n  }\r\n  return false;\r\n};\r\n\r\n/**\r\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\r\n */\r\nPriorityQueue.prototype.removeMin = function() {\r\n  this._swap(0, this._arr.length - 1);\r\n  var min = this._arr.pop();\r\n  delete this._keyIndices[min.key];\r\n  this._heapify(0);\r\n  return min.key;\r\n};\r\n\r\n/**\r\n * Decreases the priority for **key** to **priority**. If the new priority is\r\n * greater than the previous priority, this function will throw an Error.\r\n *\r\n * @param {Object} key the key for which to raise priority\r\n * @param {Number} priority the new priority for the key\r\n */\r\nPriorityQueue.prototype.decrease = function(key, priority) {\r\n  var index = this._keyIndices[key];\r\n  if (priority > this._arr[index].priority) {\r\n    throw new Error(\"New priority is greater than current priority. \" +\r\n        \"Key: \" + key + \" Old: \" + this._arr[index].priority + \" New: \" + priority);\r\n  }\r\n  this._arr[index].priority = priority;\r\n  this._decrease(index);\r\n};\r\n\r\nPriorityQueue.prototype._heapify = function(i) {\r\n  var arr = this._arr;\r\n  var l = 2 * i,\r\n      r = l + 1,\r\n      largest = i;\r\n  if (l < arr.length) {\r\n    largest = arr[l].priority < arr[largest].priority ? l : largest;\r\n    if (r < arr.length) {\r\n      largest = arr[r].priority < arr[largest].priority ? r : largest;\r\n    }\r\n    if (largest !== i) {\r\n      this._swap(i, largest);\r\n      this._heapify(largest);\r\n    }\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._decrease = function(index) {\r\n  var arr = this._arr;\r\n  var priority = arr[index].priority;\r\n  var parent;\r\n  while (index !== 0) {\r\n    parent = index >> 1;\r\n    if (arr[parent].priority < priority) {\r\n      break;\r\n    }\r\n    this._swap(index, parent);\r\n    index = parent;\r\n  }\r\n};\r\n\r\nPriorityQueue.prototype._swap = function(i, j) {\r\n  var arr = this._arr;\r\n  var keyIndices = this._keyIndices;\r\n  var origArrI = arr[i];\r\n  var origArrJ = arr[j];\r\n  arr[i] = origArrJ;\r\n  arr[j] = origArrI;\r\n  keyIndices[origArrJ.key] = i;\r\n  keyIndices[origArrI.key] = j;\r\n};\r\n\r\n},{\"../lodash\":49}],46:[function(require,module,exports){\r\n\r\n\r\nvar _ = require(\"./lodash\");\r\n\r\nmodule.exports = Graph;\r\n\r\nvar DEFAULT_EDGE_NAME = \"\\x00\",\r\n    GRAPH_NODE = \"\\x00\",\r\n    EDGE_KEY_DELIM = \"\\x01\";\r\n\r\n// Implementation notes:\r\n//\r\n//  * Node id query functions should return string ids for the nodes\r\n//  * Edge id query functions should return an \"edgeObj\", edge object, that is\r\n//    composed of enough information to uniquely identify an edge: {v, w, name}.\r\n//  * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\r\n//    reference edges. This is because we need a performant way to look these\r\n//    edges up and, object properties, which have string keys, are the closest\r\n//    we're going to get to a performant hashtable in JavaScript.\r\n\r\nfunction Graph(opts) {\r\n  this._isDirected = _.has(opts, \"directed\") ? opts.directed : true;\r\n  this._isMultigraph = _.has(opts, \"multigraph\") ? opts.multigraph : false;\r\n  this._isCompound = _.has(opts, \"compound\") ? opts.compound : false;\r\n\r\n  // Label for the graph itself\r\n  this._label = undefined;\r\n\r\n  // Defaults to be set when creating a new node\r\n  this._defaultNodeLabelFn = _.constant(undefined);\r\n\r\n  // Defaults to be set when creating a new edge\r\n  this._defaultEdgeLabelFn = _.constant(undefined);\r\n\r\n  // v -> label\r\n  this._nodes = {};\r\n\r\n  if (this._isCompound) {\r\n    // v -> parent\r\n    this._parent = {};\r\n\r\n    // v -> children\r\n    this._children = {};\r\n    this._children[GRAPH_NODE] = {};\r\n  }\r\n\r\n  // v -> edgeObj\r\n  this._in = {};\r\n\r\n  // u -> v -> Number\r\n  this._preds = {};\r\n\r\n  // v -> edgeObj\r\n  this._out = {};\r\n\r\n  // v -> w -> Number\r\n  this._sucs = {};\r\n\r\n  // e -> edgeObj\r\n  this._edgeObjs = {};\r\n\r\n  // e -> label\r\n  this._edgeLabels = {};\r\n}\r\n\r\n/* Number of nodes in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._nodeCount = 0;\r\n\r\n/* Number of edges in the graph. Should only be changed by the implementation. */\r\nGraph.prototype._edgeCount = 0;\r\n\r\n\r\n/* === Graph functions ========= */\r\n\r\nGraph.prototype.isDirected = function() {\r\n  return this._isDirected;\r\n};\r\n\r\nGraph.prototype.isMultigraph = function() {\r\n  return this._isMultigraph;\r\n};\r\n\r\nGraph.prototype.isCompound = function() {\r\n  return this._isCompound;\r\n};\r\n\r\nGraph.prototype.setGraph = function(label) {\r\n  this._label = label;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.graph = function() {\r\n  return this._label;\r\n};\r\n\r\n\r\n/* === Node functions ========== */\r\n\r\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultNodeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.nodeCount = function() {\r\n  return this._nodeCount;\r\n};\r\n\r\nGraph.prototype.nodes = function() {\r\n  return _.keys(this._nodes);\r\n};\r\n\r\nGraph.prototype.sources = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._in[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.sinks = function() {\r\n  return _.filter(this.nodes(), function(v) {\r\n    return _.isEmpty(this._out[v]);\r\n  }, this);\r\n};\r\n\r\nGraph.prototype.setNodes = function(vs, value) {\r\n  var args = arguments;\r\n  _.each(vs, function(v) {\r\n    if (args.length > 1) {\r\n      this.setNode(v, value);\r\n    } else {\r\n      this.setNode(v);\r\n    }\r\n  }, this);\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setNode = function(v, value) {\r\n  if (_.has(this._nodes, v)) {\r\n    if (arguments.length > 1) {\r\n      this._nodes[v] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\r\n  if (this._isCompound) {\r\n    this._parent[v] = GRAPH_NODE;\r\n    this._children[v] = {};\r\n    this._children[GRAPH_NODE][v] = true;\r\n  }\r\n  this._in[v] = {};\r\n  this._preds[v] = {};\r\n  this._out[v] = {};\r\n  this._sucs[v] = {};\r\n  ++this._nodeCount;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.node = function(v) {\r\n  return this._nodes[v];\r\n};\r\n\r\nGraph.prototype.hasNode = function(v) {\r\n  return _.has(this._nodes, v);\r\n};\r\n\r\nGraph.prototype.removeNode =  function(v) {\r\n  var self = this;\r\n  if (_.has(this._nodes, v)) {\r\n    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\r\n    delete this._nodes[v];\r\n    if (this._isCompound) {\r\n      this._removeFromParentsChildList(v);\r\n      delete this._parent[v];\r\n      _.each(this.children(v), function(child) {\r\n        this.setParent(child);\r\n      }, this);\r\n      delete this._children[v];\r\n    }\r\n    _.each(_.keys(this._in[v]), removeEdge);\r\n    delete this._in[v];\r\n    delete this._preds[v];\r\n    _.each(_.keys(this._out[v]), removeEdge);\r\n    delete this._out[v];\r\n    delete this._sucs[v];\r\n    --this._nodeCount;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.setParent = function(v, parent) {\r\n  if (!this._isCompound) {\r\n    throw new Error(\"Cannot set parent in a non-compound graph\");\r\n  }\r\n\r\n  if (_.isUndefined(parent)) {\r\n    parent = GRAPH_NODE;\r\n  } else {\r\n    for (var ancestor = parent;\r\n         !_.isUndefined(ancestor);\r\n         ancestor = this.parent(ancestor)) {\r\n      if (ancestor === v) {\r\n        throw new Error(\"Setting \" + parent+ \" as parent of \" + v +\r\n                        \" would create create a cycle\");\r\n      }\r\n    }\r\n\r\n    this.setNode(parent);\r\n  }\r\n\r\n  this.setNode(v);\r\n  this._removeFromParentsChildList(v);\r\n  this._parent[v] = parent;\r\n  this._children[parent][v] = true;\r\n  return this;\r\n};\r\n\r\nGraph.prototype._removeFromParentsChildList = function(v) {\r\n  delete this._children[this._parent[v]][v];\r\n};\r\n\r\nGraph.prototype.parent = function(v) {\r\n  if (this._isCompound) {\r\n    var parent = this._parent[v];\r\n    if (parent !== GRAPH_NODE) {\r\n      return parent;\r\n    }\r\n  }\r\n};\r\n\r\nGraph.prototype.children = function(v) {\r\n  if (_.isUndefined(v)) {\r\n    v = GRAPH_NODE;\r\n  }\r\n\r\n  if (this._isCompound) {\r\n    var children = this._children[v];\r\n    if (children) {\r\n      return _.keys(children);\r\n    }\r\n  } else if (v === GRAPH_NODE) {\r\n    return this.nodes();\r\n  } else if (this.hasNode(v)) {\r\n    return [];\r\n  }\r\n};\r\n\r\nGraph.prototype.predecessors = function(v) {\r\n  var predsV = this._preds[v];\r\n  if (predsV) {\r\n    return _.keys(predsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.successors = function(v) {\r\n  var sucsV = this._sucs[v];\r\n  if (sucsV) {\r\n    return _.keys(sucsV);\r\n  }\r\n};\r\n\r\nGraph.prototype.neighbors = function(v) {\r\n  var preds = this.predecessors(v);\r\n  if (preds) {\r\n    return _.union(preds, this.successors(v));\r\n  }\r\n};\r\n\r\n/* === Edge functions ========== */\r\n\r\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\r\n  if (!_.isFunction(newDefault)) {\r\n    newDefault = _.constant(newDefault);\r\n  }\r\n  this._defaultEdgeLabelFn = newDefault;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edgeCount = function() {\r\n  return this._edgeCount;\r\n};\r\n\r\nGraph.prototype.edges = function() {\r\n  return _.values(this._edgeObjs);\r\n};\r\n\r\nGraph.prototype.setPath = function(vs, value) {\r\n  var self = this,\r\n      args = arguments;\r\n  _.reduce(vs, function(v, w) {\r\n    if (args.length > 1) {\r\n      self.setEdge(v, w, value);\r\n    } else {\r\n      self.setEdge(v, w);\r\n    }\r\n    return w;\r\n  });\r\n  return this;\r\n};\r\n\r\n/*\r\n * setEdge(v, w, [value, [name]])\r\n * setEdge({ v, w, [name] }, [value])\r\n */\r\nGraph.prototype.setEdge = function() {\r\n  var v, w, name, value,\r\n      valueSpecified = false;\r\n\r\n  if (_.isPlainObject(arguments[0])) {\r\n    v = arguments[0].v;\r\n    w = arguments[0].w;\r\n    name = arguments[0].name;\r\n    if (arguments.length === 2) {\r\n      value = arguments[1];\r\n      valueSpecified = true;\r\n    }\r\n  } else {\r\n    v = arguments[0];\r\n    w = arguments[1];\r\n    name = arguments[3];\r\n    if (arguments.length > 2) {\r\n      value = arguments[2];\r\n      valueSpecified = true;\r\n    }\r\n  }\r\n\r\n  v = \"\" + v;\r\n  w = \"\" + w;\r\n  if (!_.isUndefined(name)) {\r\n    name = \"\" + name;\r\n  }\r\n\r\n  var e = edgeArgsToId(this._isDirected, v, w, name);\r\n  if (_.has(this._edgeLabels, e)) {\r\n    if (valueSpecified) {\r\n      this._edgeLabels[e] = value;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  if (!_.isUndefined(name) && !this._isMultigraph) {\r\n    throw new Error(\"Cannot set a named edge when isMultigraph = false\");\r\n  }\r\n\r\n  // It didn't exist, so we need to create it.\r\n  // First ensure the nodes exist.\r\n  this.setNode(v);\r\n  this.setNode(w);\r\n\r\n  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\r\n\r\n  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\r\n  // Ensure we add undirected edges in a consistent way.\r\n  v = edgeObj.v;\r\n  w = edgeObj.w;\r\n\r\n  Object.freeze(edgeObj);\r\n  this._edgeObjs[e] = edgeObj;\r\n  incrementOrInitEntry(this._preds[w], v);\r\n  incrementOrInitEntry(this._sucs[v], w);\r\n  this._in[w][e] = edgeObj;\r\n  this._out[v][e] = edgeObj;\r\n  this._edgeCount++;\r\n  return this;\r\n};\r\n\r\nGraph.prototype.edge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return this._edgeLabels[e];\r\n};\r\n\r\nGraph.prototype.hasEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name));\r\n  return _.has(this._edgeLabels, e);\r\n};\r\n\r\nGraph.prototype.removeEdge = function(v, w, name) {\r\n  var e = (arguments.length === 1\r\n            ? edgeObjToId(this._isDirected, arguments[0])\r\n            : edgeArgsToId(this._isDirected, v, w, name)),\r\n      edge = this._edgeObjs[e];\r\n  if (edge) {\r\n    v = edge.v;\r\n    w = edge.w;\r\n    delete this._edgeLabels[e];\r\n    delete this._edgeObjs[e];\r\n    decrementOrRemoveEntry(this._preds[w], v);\r\n    decrementOrRemoveEntry(this._sucs[v], w);\r\n    delete this._in[w][e];\r\n    delete this._out[v][e];\r\n    this._edgeCount--;\r\n  }\r\n  return this;\r\n};\r\n\r\nGraph.prototype.inEdges = function(v, u) {\r\n  var inV = this._in[v];\r\n  if (inV) {\r\n    var edges = _.values(inV);\r\n    if (!u) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.v === u; });\r\n  }\r\n};\r\n\r\nGraph.prototype.outEdges = function(v, w) {\r\n  var outV = this._out[v];\r\n  if (outV) {\r\n    var edges = _.values(outV);\r\n    if (!w) {\r\n      return edges;\r\n    }\r\n    return _.filter(edges, function(edge) { return edge.w === w; });\r\n  }\r\n};\r\n\r\nGraph.prototype.nodeEdges = function(v, w) {\r\n  var inEdges = this.inEdges(v, w);\r\n  if (inEdges) {\r\n    return inEdges.concat(this.outEdges(v, w));\r\n  }\r\n};\r\n\r\nfunction incrementOrInitEntry(map, k) {\r\n  if (_.has(map, k)) {\r\n    map[k]++;\r\n  } else {\r\n    map[k] = 1;\r\n  }\r\n}\r\n\r\nfunction decrementOrRemoveEntry(map, k) {\r\n  if (!--map[k]) { delete map[k]; }\r\n}\r\n\r\nfunction edgeArgsToId(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\r\n             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\r\n}\r\n\r\nfunction edgeArgsToObj(isDirected, v, w, name) {\r\n  if (!isDirected && v > w) {\r\n    var tmp = v;\r\n    v = w;\r\n    w = tmp;\r\n  }\r\n  var edgeObj =  { v: v, w: w };\r\n  if (name) {\r\n    edgeObj.name = name;\r\n  }\r\n  return edgeObj;\r\n}\r\n\r\nfunction edgeObjToId(isDirected, edgeObj) {\r\n  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\r\n}\r\n\r\n},{\"./lodash\":49}],47:[function(require,module,exports){\r\n// Includes only the \"core\" of graphlib\r\nmodule.exports = {\r\n  Graph: require(\"./graph\"),\r\n  version: require(\"./version\")\r\n};\r\n\r\n},{\"./graph\":46,\"./version\":50}],48:[function(require,module,exports){\r\nvar _ = require(\"./lodash\"),\r\n    Graph = require(\"./graph\");\r\n\r\nmodule.exports = {\r\n  write: write,\r\n  read: read\r\n};\r\n\r\nfunction write(g) {\r\n  var json = {\r\n    options: {\r\n      directed: g.isDirected(),\r\n      multigraph: g.isMultigraph(),\r\n      compound: g.isCompound()\r\n    },\r\n    nodes: writeNodes(g),\r\n    edges: writeEdges(g)\r\n  };\r\n  if (!_.isUndefined(g.graph())) {\r\n    json.value = _.clone(g.graph());\r\n  }\r\n  return json;\r\n}\r\n\r\nfunction writeNodes(g) {\r\n  return _.map(g.nodes(), function(v) {\r\n    var nodeValue = g.node(v),\r\n        parent = g.parent(v),\r\n        node = { v: v };\r\n    if (!_.isUndefined(nodeValue)) {\r\n      node.value = nodeValue;\r\n    }\r\n    if (!_.isUndefined(parent)) {\r\n      node.parent = parent;\r\n    }\r\n    return node;\r\n  });\r\n}\r\n\r\nfunction writeEdges(g) {\r\n  return _.map(g.edges(), function(e) {\r\n    var edgeValue = g.edge(e),\r\n        edge = { v: e.v, w: e.w };\r\n    if (!_.isUndefined(e.name)) {\r\n      edge.name = e.name;\r\n    }\r\n    if (!_.isUndefined(edgeValue)) {\r\n      edge.value = edgeValue;\r\n    }\r\n    return edge;\r\n  });\r\n}\r\n\r\nfunction read(json) {\r\n  var g = new Graph(json.options).setGraph(json.value);\r\n  _.each(json.nodes, function(entry) {\r\n    g.setNode(entry.v, entry.value);\r\n    if (entry.parent) {\r\n      g.setParent(entry.v, entry.parent);\r\n    }\r\n  });\r\n  _.each(json.edges, function(entry) {\r\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\r\n  });\r\n  return g;\r\n}\r\n\r\n},{\"./graph\":46,\"./lodash\":49}],49:[function(require,module,exports){\r\nmodule.exports=require(10)\r\n},{\"/Users/cpettitt/projects/dagre/lib/lodash.js\":10,\"lodash\":51}],50:[function(require,module,exports){\r\nmodule.exports = '1.0.1';\r\n\r\n},{}],51:[function(require,module,exports){\r\n(function (global){\r\n/**\r\n * @license\r\n * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>\r\n * Build: `lodash modern -o ./dist/lodash.js`\r\n * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>\r\n * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>\r\n * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n * Available under MIT license <http://lodash.com/license>\r\n */\r\n;(function() {\r\n\r\n  /** Used as a safe reference for `undefined` in pre ES5 environments */\r\n  var undefined;\r\n\r\n  /** Used to pool arrays and objects used internally */\r\n  var arrayPool = [],\r\n      objectPool = [];\r\n\r\n  /** Used to generate unique IDs */\r\n  var idCounter = 0;\r\n\r\n  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */\r\n  var keyPrefix = +new Date + '';\r\n\r\n  /** Used as the size when optimizations are enabled for large arrays */\r\n  var largeArraySize = 75;\r\n\r\n  /** Used as the max size of the `arrayPool` and `objectPool` */\r\n  var maxPoolSize = 40;\r\n\r\n  /** Used to detect and test whitespace */\r\n  var whitespace = (\r\n    // whitespace\r\n    ' \\t\\x0B\\f\\xA0\\ufeff' +\r\n\r\n    // line terminators\r\n    '\\n\\r\\u2028\\u2029' +\r\n\r\n    // unicode category \"Zs\" space separators\r\n    '\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000'\r\n  );\r\n\r\n  /** Used to match empty string literals in compiled template source */\r\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\r\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\r\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\r\n\r\n  /**\r\n   * Used to match ES6 template delimiters\r\n   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals\r\n   */\r\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\r\n\r\n  /** Used to match regexp flags from their coerced string values */\r\n  var reFlags = /\\w*$/;\r\n\r\n  /** Used to detected named functions */\r\n  var reFuncName = /^\\s*function[ \\n\\r\\t]+\\w/;\r\n\r\n  /** Used to match \"interpolate\" template delimiters */\r\n  var reInterpolate = /<%=([\\s\\S]+?)%>/g;\r\n\r\n  /** Used to match leading whitespace and zeros to be removed */\r\n  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');\r\n\r\n  /** Used to ensure capturing order of template delimiters */\r\n  var reNoMatch = /($^)/;\r\n\r\n  /** Used to detect functions containing a `this` reference */\r\n  var reThis = /\\bthis\\b/;\r\n\r\n  /** Used to match unescaped characters in compiled string literals */\r\n  var reUnescapedString = /['\\n\\r\\t\\u2028\\u2029\\\\]/g;\r\n\r\n  /** Used to assign default `context` object properties */\r\n  var contextProps = [\r\n    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',\r\n    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',\r\n    'parseInt', 'setTimeout'\r\n  ];\r\n\r\n  /** Used to make template sourceURLs easier to identify */\r\n  var templateCounter = 0;\r\n\r\n  /** `Object#toString` result shortcuts */\r\n  var argsClass = '[object Arguments]',\r\n      arrayClass = '[object Array]',\r\n      boolClass = '[object Boolean]',\r\n      dateClass = '[object Date]',\r\n      funcClass = '[object Function]',\r\n      numberClass = '[object Number]',\r\n      objectClass = '[object Object]',\r\n      regexpClass = '[object RegExp]',\r\n      stringClass = '[object String]';\r\n\r\n  /** Used to identify object classifications that `_.clone` supports */\r\n  var cloneableClasses = {};\r\n  cloneableClasses[funcClass] = false;\r\n  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =\r\n  cloneableClasses[boolClass] = cloneableClasses[dateClass] =\r\n  cloneableClasses[numberClass] = cloneableClasses[objectClass] =\r\n  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;\r\n\r\n  /** Used as an internal `_.debounce` options object */\r\n  var debounceOptions = {\r\n    'leading': false,\r\n    'maxWait': 0,\r\n    'trailing': false\r\n  };\r\n\r\n  /** Used as the property descriptor for `__bindData__` */\r\n  var descriptor = {\r\n    'configurable': false,\r\n    'enumerable': false,\r\n    'value': null,\r\n    'writable': false\r\n  };\r\n\r\n  /** Used to determine if values are of the language type Object */\r\n  var objectTypes = {\r\n    'boolean': false,\r\n    'function': true,\r\n    'object': true,\r\n    'number': false,\r\n    'string': false,\r\n    'undefined': false\r\n  };\r\n\r\n  /** Used to escape characters for inclusion in compiled string literals */\r\n  var stringEscapes = {\r\n    '\\\\': '\\\\',\r\n    \"'\": \"'\",\r\n    '\\n': 'n',\r\n    '\\r': 'r',\r\n    '\\t': 't',\r\n    '\\u2028': 'u2028',\r\n    '\\u2029': 'u2029'\r\n  };\r\n\r\n  /** Used as a reference to the global object */\r\n  var root = (objectTypes[typeof window] && window) || this;\r\n\r\n  /** Detect free variable `exports` */\r\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\r\n\r\n  /** Detect free variable `module` */\r\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\r\n\r\n  /** Detect the popular CommonJS extension `module.exports` */\r\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\r\n\r\n  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */\r\n  var freeGlobal = objectTypes[typeof global] && global;\r\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\r\n    root = freeGlobal;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * The base implementation of `_.indexOf` without support for binary searches\r\n   * or `fromIndex` constraints.\r\n   *\r\n   * @private\r\n   * @param {Array} array The array to search.\r\n   * @param {*} value The value to search for.\r\n   * @param {number} [fromIndex=0] The index to search from.\r\n   * @returns {number} Returns the index of the matched value or `-1`.\r\n   */\r\n  function baseIndexOf(array, value, fromIndex) {\r\n    var index = (fromIndex || 0) - 1,\r\n        length = array ? array.length : 0;\r\n\r\n    while (++index < length) {\r\n      if (array[index] === value) {\r\n        return index;\r\n      }\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  /**\r\n   * An implementation of `_.contains` for cache objects that mimics the return\r\n   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.\r\n   *\r\n   * @private\r\n   * @param {Object} cache The cache object to inspect.\r\n   * @param {*} value The value to search for.\r\n   * @returns {number} Returns `0` if `value` is found, else `-1`.\r\n   */\r\n  function cacheIndexOf(cache, value) {\r\n    var type = typeof value;\r\n    cache = cache.cache;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      return cache[value] ? 0 : -1;\r\n    }\r\n    if (type != 'number' && type != 'string') {\r\n      type = 'object';\r\n    }\r\n    var key = type == 'number' ? value : keyPrefix + value;\r\n    cache = (cache = cache[type]) && cache[key];\r\n\r\n    return type == 'object'\r\n      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)\r\n      : (cache ? 0 : -1);\r\n  }\r\n\r\n  /**\r\n   * Adds a given value to the corresponding cache object.\r\n   *\r\n   * @private\r\n   * @param {*} value The value to add to the cache.\r\n   */\r\n  function cachePush(value) {\r\n    var cache = this.cache,\r\n        type = typeof value;\r\n\r\n    if (type == 'boolean' || value == null) {\r\n      cache[value] = true;\r\n    } else {\r\n      if (type != 'number' && type != 'string') {\r\n        type = 'object';\r\n      }\r\n      var key = type == 'number' ? value : keyPrefix + value,\r\n          typeCache = cache[type] || (cache[type] = {});\r\n\r\n      if (type == 'object') {\r\n        (typeCache[key] || (typeCache[key] = [])).push(value);\r\n      } else {\r\n        typeCache[key] = true;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used by `_.max` and `_.min` as the default callback when a given\r\n   * collection is a string value.\r\n   *\r\n   * @private\r\n   * @param {string} value The character to inspect.\r\n   * @returns {number} Returns the code unit of given character.\r\n   */\r\n  function charAtCallback(value) {\r\n    return value.charCodeAt(0);\r\n  }\r\n\r\n  /**\r\n   * Used by `sortBy` to compare transformed `collection` elements, stable sorting\r\n   * them in ascending order.\r\n   *\r\n   * @private\r\n   * @param {Object} a The object to compare to `b`.\r\n   * @param {Object} b The object to compare to `a`.\r\n   * @returns {number} Returns the sort order indicator of `1` or `-1`.\r\n   */\r\n  function compareAscending(a, b) {\r\n    var ac = a.criteria,\r\n        bc = b.criteria,\r\n        index = -1,\r\n        length = ac.length;\r\n\r\n    while (++index < length) {\r\n      var value = ac[index],\r\n          other = bc[index];\r\n\r\n      if (value !== other) {\r\n        if (value > other || typeof value == 'undefined') {\r\n          return 1;\r\n        }\r\n        if (value < other || typeof other == 'undefined') {\r\n          return -1;\r\n        }\r\n      }\r\n    }\r\n    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\r\n    // that causes it, under certain circumstances, to return the same value for\r\n    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247\r\n    //\r\n    // This also ensures a stable sort in V8 and other engines.\r\n    // See http://code.google.com/p/v8/issues/detail?id=90\r\n    return a.index - b.index;\r\n  }\r\n\r\n  /**\r\n   * Creates a cache object to optimize linear searches of large arrays.\r\n   *\r\n   * @private\r\n   * @param {Array} [array=[]] The array to search.\r\n   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.\r\n   */\r\n  function createCache(array) {\r\n    var index = -1,\r\n        length = array.length,\r\n        first = array[0],\r\n        mid = array[(length / 2) | 0],\r\n        last = array[length - 1];\r\n\r\n    if (first && typeof first == 'object' &&\r\n        mid && typeof mid == 'object' && last && typeof last == 'object') {\r\n      return false;\r\n    }\r\n    var cache = getObject();\r\n    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;\r\n\r\n    var result = getObject();\r\n    result.array = array;\r\n    result.cache = cache;\r\n    result.push = cachePush;\r\n\r\n    while (++index < length) {\r\n      result.push(array[index]);\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Used by `template` to escape characters for inclusion in compiled\r\n   * string literals.\r\n   *\r\n   * @private\r\n   * @param {string} match The matched character to escape.\r\n   * @returns {string} Returns the escaped character.\r\n   */\r\n  function escapeStringChar(match) {\r\n    return '\\\\' + stringEscapes[match];\r\n  }\r\n\r\n  /**\r\n   * Gets an array from the array pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Array} The array from the pool.\r\n   */\r\n  function getArray() {\r\n    return arrayPool.pop() || [];\r\n  }\r\n\r\n  /**\r\n   * Gets an object from the object pool or creates a new one if the pool is empty.\r\n   *\r\n   * @private\r\n   * @returns {Object} The object from the pool.\r\n   */\r\n  function getObject() {\r\n    return objectPool.pop() || {\r\n      'array': null,\r\n      'cache': null,\r\n      'criteria': null,\r\n      'false': false,\r\n      'index': 0,\r\n      'null': false,\r\n      'number': null,\r\n      'object': null,\r\n      'push': null,\r\n      'string': null,\r\n      'true': false,\r\n      'undefined': false,\r\n      'value': null\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Releases the given array back to the array pool.\r\n   *\r\n   * @private\r\n   * @param {Array} [array] The array to release.\r\n   */\r\n  function releaseArray(array) {\r\n    array.length = 0;\r\n    if (arrayPool.length < maxPoolSize) {\r\n      arrayPool.push(array);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Releases the given object back to the object pool.\r\n   *\r\n   * @private\r\n   * @param {Object} [object] The object to release.\r\n   */\r\n  function releaseObject(object) {\r\n    var cache = object.cache;\r\n    if (cache) {\r\n      releaseObject(cache);\r\n    }\r\n    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;\r\n    if (objectPool.length < maxPoolSize) {\r\n      objectPool.push(object);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Slices the `collection` from the `start` index up to, but not including,\r\n   * the `end` index.\r\n   *\r\n   * Note: This function is used instead of `Array#slice` to support node lists\r\n   * in IE < 9 and to ensure dense arrays are returned.\r\n   *\r\n   * @private\r\n   * @param {Array|Object|string} collection The collection to slice.\r\n   * @param {number} start The start index.\r\n   * @param {number} end The end index.\r\n   * @returns {Array} Returns the new array.\r\n   */\r\n  function slice(array, start, end) {\r\n    start || (start = 0);\r\n    if (typeof end == 'undefined') {\r\n      end = array ? array.length : 0;\r\n    }\r\n    var index = -1,\r\n        length = end - start || 0,\r\n        result = Array(length < 0 ? 0 : length);\r\n\r\n    while (++index < length) {\r\n      result[index] = array[start + index];\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  /**\r\n   * Create a new `lodash` function using the given context object.\r\n   *\r\n   * @static\r\n   * @memberOf _\r\n   * @category Utilities\r\n   * @param {Object} [context=root] The context object.\r\n   * @returns {Function} Returns the `lodash` function.\r\n   */\r\n  function runInContext(context) {\r\n    // Avoid issues with some ES3 environments that attempt to use values, named\r\n    // after built-in constructors like `Object`, for the creation of literals.\r\n    // ES5 clears this up by stating that literals must use built-in constructors.\r\n    // See http://es5.github.io/#x11.1.5.\r\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\r\n\r\n    /** Native constructor references */\r\n    var Array = context.Array,\r\n        Boolean = context.Boolean,\r\n        Date = context.Date,\r\n        Function = context.Function,\r\n        Math = context.Math,\r\n        Number = context.Number,\r\n        Object = context.Object,\r\n        RegExp = context.RegExp,\r\n        String = context.String,\r\n        TypeError = context.TypeError;\r\n\r\n    /**\r\n     * Used for `Array` method references.\r\n     *\r\n     * Normally `Array.prototype` would suffice, however, using an array literal\r\n     * avoids issues in Narwhal.\r\n     */\r\n    var arrayRef = [];\r\n\r\n    /** Used for native method references */\r\n    var objectProto = Object.prototype;\r\n\r\n    /** Used to restore the original `_` reference in `noConflict` */\r\n    var oldDash = context._;\r\n\r\n    /** Used to resolve the internal [[Class]] of values */\r\n    var toString = objectProto.toString;\r\n\r\n    /** Used to detect if a method is native */\r\n    var reNative = RegExp('^' +\r\n      String(toString)\r\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\r\n    );\r\n\r\n    /** Native method shortcuts */\r\n    var ceil = Math.ceil,\r\n        clearTimeout = context.clearTimeout,\r\n        floor = Math.floor,\r\n        fnToString = Function.prototype.toString,\r\n        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,\r\n        hasOwnProperty = objectProto.hasOwnProperty,\r\n        push = arrayRef.push,\r\n        setTimeout = context.setTimeout,\r\n        splice = arrayRef.splice,\r\n        unshift = arrayRef.unshift;\r\n\r\n    /** Used to set meta data on functions */\r\n    var defineProperty = (function() {\r\n      // IE 8 only accepts DOM elements\r\n      try {\r\n        var o = {},\r\n            func = isNative(func = Object.defineProperty) && func,\r\n            result = func(o, o, o) && func;\r\n      } catch(e) { }\r\n      return result;\r\n    }());\r\n\r\n    /* Native method shortcuts for methods with the same name as other `lodash` methods */\r\n    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,\r\n        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,\r\n        nativeIsFinite = context.isFinite,\r\n        nativeIsNaN = context.isNaN,\r\n        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,\r\n        nativeMax = Math.max,\r\n        nativeMin = Math.min,\r\n        nativeParseInt = context.parseInt,\r\n        nativeRandom = Math.random;\r\n\r\n    /** Used to lookup a built-in constructor by [[Class]] */\r\n    var ctorByClass = {};\r\n    ctorByClass[arrayClass] = Array;\r\n    ctorByClass[boolClass] = Boolean;\r\n    ctorByClass[dateClass] = Date;\r\n    ctorByClass[funcClass] = Function;\r\n    ctorByClass[objectClass] = Object;\r\n    ctorByClass[numberClass] = Number;\r\n    ctorByClass[regexpClass] = RegExp;\r\n    ctorByClass[stringClass] = String;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object which wraps the given value to enable intuitive\r\n     * method chaining.\r\n     *\r\n     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:\r\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,\r\n     * and `unshift`\r\n     *\r\n     * Chaining is supported in custom builds as long as the `value` method is\r\n     * implicitly or explicitly included in the build.\r\n     *\r\n     * The chainable wrapper functions are:\r\n     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,\r\n     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,\r\n     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,\r\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\r\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\r\n     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,\r\n     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,\r\n     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,\r\n     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,\r\n     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,\r\n     * and `zip`\r\n     *\r\n     * The non-chainable wrapper functions are:\r\n     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,\r\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,\r\n     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\r\n     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,\r\n     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,\r\n     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,\r\n     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,\r\n     * `template`, `unescape`, `uniqueId`, and `value`\r\n     *\r\n     * The wrapper functions `first` and `last` return wrapped values when `n` is\r\n     * provided, otherwise they return unwrapped values.\r\n     *\r\n     * Explicit chaining can be enabled by using the `_.chain` method.\r\n     *\r\n     * @name _\r\n     * @constructor\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     * @example\r\n     *\r\n     * var wrapped = _([1, 2, 3]);\r\n     *\r\n     * // returns an unwrapped value\r\n     * wrapped.reduce(function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * // returns a wrapped value\r\n     * var squares = wrapped.map(function(num) {\r\n     *   return num * num;\r\n     * });\r\n     *\r\n     * _.isArray(squares);\r\n     * // => false\r\n     *\r\n     * _.isArray(squares.value());\r\n     * // => true\r\n     */\r\n    function lodash(value) {\r\n      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor\r\n      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))\r\n       ? value\r\n       : new lodashWrapper(value);\r\n    }\r\n\r\n    /**\r\n     * A fast path for creating `lodash` wrapper objects.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to wrap in a `lodash` instance.\r\n     * @param {boolean} chainAll A flag to enable chaining for all methods\r\n     * @returns {Object} Returns a `lodash` instance.\r\n     */\r\n    function lodashWrapper(value, chainAll) {\r\n      this.__chain__ = !!chainAll;\r\n      this.__wrapped__ = value;\r\n    }\r\n    // ensure `new lodashWrapper` is an instance of `lodash`\r\n    lodashWrapper.prototype = lodash.prototype;\r\n\r\n    /**\r\n     * An object used to flag environments features.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    var support = lodash.support = {};\r\n\r\n    /**\r\n     * Detect if functions can be decompiled by `Function#toString`\r\n     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);\r\n\r\n    /**\r\n     * Detect if `Function#name` is supported (all but IE).\r\n     *\r\n     * @memberOf _.support\r\n     * @type boolean\r\n     */\r\n    support.funcNames = typeof Function.name == 'string';\r\n\r\n    /**\r\n     * By default, the template delimiters used by Lo-Dash are similar to those in\r\n     * embedded Ruby (ERB). Change the following template settings to use alternative\r\n     * delimiters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Object\r\n     */\r\n    lodash.templateSettings = {\r\n\r\n      /**\r\n       * Used to detect `data` property values to be HTML-escaped.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'escape': /<%-([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect code to be evaluated.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'evaluate': /<%([\\s\\S]+?)%>/g,\r\n\r\n      /**\r\n       * Used to detect `data` property values to inject.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type RegExp\r\n       */\r\n      'interpolate': reInterpolate,\r\n\r\n      /**\r\n       * Used to reference the data object in the template text.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type string\r\n       */\r\n      'variable': '',\r\n\r\n      /**\r\n       * Used to import variables into the compiled template.\r\n       *\r\n       * @memberOf _.templateSettings\r\n       * @type Object\r\n       */\r\n      'imports': {\r\n\r\n        /**\r\n         * A reference to the `lodash` function.\r\n         *\r\n         * @memberOf _.templateSettings.imports\r\n         * @type Function\r\n         */\r\n        '_': lodash\r\n      }\r\n    };\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The base implementation of `_.bind` that creates the bound function and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new bound function.\r\n     */\r\n    function baseBind(bindData) {\r\n      var func = bindData[0],\r\n          partialArgs = bindData[2],\r\n          thisArg = bindData[4];\r\n\r\n      function bound() {\r\n        // `Function#bind` spec\r\n        // http://es5.github.io/#x15.3.4.5\r\n        if (partialArgs) {\r\n          // avoid `arguments` object deoptimizations by using `slice` instead\r\n          // of `Array.prototype.slice.call` and not assigning `arguments` to a\r\n          // variable as a ternary expression\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        // mimic the constructor's `return` behavior\r\n        // http://es5.github.io/#x13.2.2\r\n        if (this instanceof bound) {\r\n          // ensure `new bound` is an instance of `func`\r\n          var thisBinding = baseCreate(func.prototype),\r\n              result = func.apply(thisBinding, args || arguments);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisArg, args || arguments);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.clone` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\r\n     * @returns {*} Returns the cloned value.\r\n     */\r\n    function baseClone(value, isDeep, callback, stackA, stackB) {\r\n      if (callback) {\r\n        var result = callback(value);\r\n        if (typeof result != 'undefined') {\r\n          return result;\r\n        }\r\n      }\r\n      // inspect [[Class]]\r\n      var isObj = isObject(value);\r\n      if (isObj) {\r\n        var className = toString.call(value);\r\n        if (!cloneableClasses[className]) {\r\n          return value;\r\n        }\r\n        var ctor = ctorByClass[className];\r\n        switch (className) {\r\n          case boolClass:\r\n          case dateClass:\r\n            return new ctor(+value);\r\n\r\n          case numberClass:\r\n          case stringClass:\r\n            return new ctor(value);\r\n\r\n          case regexpClass:\r\n            result = ctor(value.source, reFlags.exec(value));\r\n            result.lastIndex = value.lastIndex;\r\n            return result;\r\n        }\r\n      } else {\r\n        return value;\r\n      }\r\n      var isArr = isArray(value);\r\n      if (isDeep) {\r\n        // check for circular references and return corresponding clone\r\n        var initedStack = !stackA;\r\n        stackA || (stackA = getArray());\r\n        stackB || (stackB = getArray());\r\n\r\n        var length = stackA.length;\r\n        while (length--) {\r\n          if (stackA[length] == value) {\r\n            return stackB[length];\r\n          }\r\n        }\r\n        result = isArr ? ctor(value.length) : {};\r\n      }\r\n      else {\r\n        result = isArr ? slice(value) : assign({}, value);\r\n      }\r\n      // add array properties assigned by `RegExp#exec`\r\n      if (isArr) {\r\n        if (hasOwnProperty.call(value, 'index')) {\r\n          result.index = value.index;\r\n        }\r\n        if (hasOwnProperty.call(value, 'input')) {\r\n          result.input = value.input;\r\n        }\r\n      }\r\n      // exit for shallow clone\r\n      if (!isDeep) {\r\n        return result;\r\n      }\r\n      // add the source value to the stack of traversed objects\r\n      // and associate it with its clone\r\n      stackA.push(value);\r\n      stackB.push(result);\r\n\r\n      // recursively populate clone (susceptible to call stack limits)\r\n      (isArr ? forEach : forOwn)(value, function(objValue, key) {\r\n        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);\r\n      });\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.create` without support for assigning\r\n     * properties to the created object.\r\n     *\r\n     * @private\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @returns {Object} Returns the new object.\r\n     */\r\n    function baseCreate(prototype, properties) {\r\n      return isObject(prototype) ? nativeCreate(prototype) : {};\r\n    }\r\n    // fallback for browsers without `Object.create`\r\n    if (!nativeCreate) {\r\n      baseCreate = (function() {\r\n        function Object() {}\r\n        return function(prototype) {\r\n          if (isObject(prototype)) {\r\n            Object.prototype = prototype;\r\n            var result = new Object;\r\n            Object.prototype = null;\r\n          }\r\n          return result || context.Object();\r\n        };\r\n      }());\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.createCallback` without support for creating\r\n     * \"_.pluck\" or \"_.where\" style callbacks.\r\n     *\r\n     * @private\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     */\r\n    function baseCreateCallback(func, thisArg, argCount) {\r\n      if (typeof func != 'function') {\r\n        return identity;\r\n      }\r\n      // exit early for no `thisArg` or already bound by `Function#bind`\r\n      if (typeof thisArg == 'undefined' || !('prototype' in func)) {\r\n        return func;\r\n      }\r\n      var bindData = func.__bindData__;\r\n      if (typeof bindData == 'undefined') {\r\n        if (support.funcNames) {\r\n          bindData = !func.name;\r\n        }\r\n        bindData = bindData || !support.funcDecomp;\r\n        if (!bindData) {\r\n          var source = fnToString.call(func);\r\n          if (!support.funcNames) {\r\n            bindData = !reFuncName.test(source);\r\n          }\r\n          if (!bindData) {\r\n            // checks if `func` references the `this` keyword and stores the result\r\n            bindData = reThis.test(source);\r\n            setBindData(func, bindData);\r\n          }\r\n        }\r\n      }\r\n      // exit early if there are no `this` references or `func` is bound\r\n      if (bindData === false || (bindData !== true && bindData[1] & 1)) {\r\n        return func;\r\n      }\r\n      switch (argCount) {\r\n        case 1: return function(value) {\r\n          return func.call(thisArg, value);\r\n        };\r\n        case 2: return function(a, b) {\r\n          return func.call(thisArg, a, b);\r\n        };\r\n        case 3: return function(value, index, collection) {\r\n          return func.call(thisArg, value, index, collection);\r\n        };\r\n        case 4: return function(accumulator, value, index, collection) {\r\n          return func.call(thisArg, accumulator, value, index, collection);\r\n        };\r\n      }\r\n      return bind(func, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `createWrapper` that creates the wrapper and\r\n     * sets its meta data.\r\n     *\r\n     * @private\r\n     * @param {Array} bindData The bind data array.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function baseCreateWrapper(bindData) {\r\n      var func = bindData[0],\r\n          bitmask = bindData[1],\r\n          partialArgs = bindData[2],\r\n          partialRightArgs = bindData[3],\r\n          thisArg = bindData[4],\r\n          arity = bindData[5];\r\n\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          key = func;\r\n\r\n      function bound() {\r\n        var thisBinding = isBind ? thisArg : this;\r\n        if (partialArgs) {\r\n          var args = slice(partialArgs);\r\n          push.apply(args, arguments);\r\n        }\r\n        if (partialRightArgs || isCurry) {\r\n          args || (args = slice(arguments));\r\n          if (partialRightArgs) {\r\n            push.apply(args, partialRightArgs);\r\n          }\r\n          if (isCurry && args.length < arity) {\r\n            bitmask |= 16 & ~32;\r\n            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);\r\n          }\r\n        }\r\n        args || (args = arguments);\r\n        if (isBindKey) {\r\n          func = thisBinding[key];\r\n        }\r\n        if (this instanceof bound) {\r\n          thisBinding = baseCreate(func.prototype);\r\n          var result = func.apply(thisBinding, args);\r\n          return isObject(result) ? result : thisBinding;\r\n        }\r\n        return func.apply(thisBinding, args);\r\n      }\r\n      setBindData(bound, bindData);\r\n      return bound;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.difference` that accepts a single array\r\n     * of values to exclude.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {Array} [values] The array of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     */\r\n    function baseDifference(array, values) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          isLarge = length >= largeArraySize && indexOf === baseIndexOf,\r\n          result = [];\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(values);\r\n        if (cache) {\r\n          indexOf = cacheIndexOf;\r\n          values = cache;\r\n        } else {\r\n          isLarge = false;\r\n        }\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (indexOf(values, value) < 0) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseObject(values);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.flatten` without support for callback\r\n     * shorthands or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.\r\n     * @param {number} [fromIndex=0] The index to start from.\r\n     * @returns {Array} Returns a new flattened array.\r\n     */\r\n    function baseFlatten(array, isShallow, isStrict, fromIndex) {\r\n      var index = (fromIndex || 0) - 1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n\r\n        if (value && typeof value == 'object' && typeof value.length == 'number'\r\n            && (isArray(value) || isArguments(value))) {\r\n          // recursively flatten arrays (susceptible to call stack limits)\r\n          if (!isShallow) {\r\n            value = baseFlatten(value, isShallow, isStrict);\r\n          }\r\n          var valIndex = -1,\r\n              valLength = value.length,\r\n              resIndex = result.length;\r\n\r\n          result.length += valLength;\r\n          while (++valIndex < valLength) {\r\n            result[resIndex++] = value[valIndex];\r\n          }\r\n        } else if (!isStrict) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.isEqual`, without support for `thisArg` binding,\r\n     * that allows partial \"_.where\" style comparisons.\r\n     *\r\n     * @private\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.\r\n     * @param {Array} [stackA=[]] Tracks traversed `a` objects.\r\n     * @param {Array} [stackB=[]] Tracks traversed `b` objects.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     */\r\n    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {\r\n      // used to indicate that when comparing objects, `a` has at least the properties of `b`\r\n      if (callback) {\r\n        var result = callback(a, b);\r\n        if (typeof result != 'undefined') {\r\n          return !!result;\r\n        }\r\n      }\r\n      // exit early for identical values\r\n      if (a === b) {\r\n        // treat `+0` vs. `-0` as not equal\r\n        return a !== 0 || (1 / a == 1 / b);\r\n      }\r\n      var type = typeof a,\r\n          otherType = typeof b;\r\n\r\n      // exit early for unlike primitive values\r\n      if (a === a &&\r\n          !(a && objectTypes[type]) &&\r\n          !(b && objectTypes[otherType])) {\r\n        return false;\r\n      }\r\n      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior\r\n      // http://es5.github.io/#x15.3.4.4\r\n      if (a == null || b == null) {\r\n        return a === b;\r\n      }\r\n      // compare [[Class]] names\r\n      var className = toString.call(a),\r\n          otherClass = toString.call(b);\r\n\r\n      if (className == argsClass) {\r\n        className = objectClass;\r\n      }\r\n      if (otherClass == argsClass) {\r\n        otherClass = objectClass;\r\n      }\r\n      if (className != otherClass) {\r\n        return false;\r\n      }\r\n      switch (className) {\r\n        case boolClass:\r\n        case dateClass:\r\n          // coerce dates and booleans to numbers, dates to milliseconds and booleans\r\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\r\n          return +a == +b;\r\n\r\n        case numberClass:\r\n          // treat `NaN` vs. `NaN` as equal\r\n          return (a != +a)\r\n            ? b != +b\r\n            // but treat `+0` vs. `-0` as not equal\r\n            : (a == 0 ? (1 / a == 1 / b) : a == +b);\r\n\r\n        case regexpClass:\r\n        case stringClass:\r\n          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\r\n          // treat string primitives and their corresponding object instances as equal\r\n          return a == String(b);\r\n      }\r\n      var isArr = className == arrayClass;\r\n      if (!isArr) {\r\n        // unwrap any `lodash` wrapped values\r\n        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),\r\n            bWrapped = hasOwnProperty.call(b, '__wrapped__');\r\n\r\n        if (aWrapped || bWrapped) {\r\n          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);\r\n        }\r\n        // exit for functions and DOM nodes\r\n        if (className != objectClass) {\r\n          return false;\r\n        }\r\n        // in older versions of Opera, `arguments` objects have `Array` constructors\r\n        var ctorA = a.constructor,\r\n            ctorB = b.constructor;\r\n\r\n        // non `Object` object instances with different constructors are not equal\r\n        if (ctorA != ctorB &&\r\n              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\r\n              ('constructor' in a && 'constructor' in b)\r\n            ) {\r\n          return false;\r\n        }\r\n      }\r\n      // assume cyclic structures are equal\r\n      // the algorithm for detecting cyclic structures is adapted from ES 5.1\r\n      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\r\n      var initedStack = !stackA;\r\n      stackA || (stackA = getArray());\r\n      stackB || (stackB = getArray());\r\n\r\n      var length = stackA.length;\r\n      while (length--) {\r\n        if (stackA[length] == a) {\r\n          return stackB[length] == b;\r\n        }\r\n      }\r\n      var size = 0;\r\n      result = true;\r\n\r\n      // add `a` and `b` to the stack of traversed objects\r\n      stackA.push(a);\r\n      stackB.push(b);\r\n\r\n      // recursively compare objects and arrays (susceptible to call stack limits)\r\n      if (isArr) {\r\n        // compare lengths to determine if a deep comparison is necessary\r\n        length = a.length;\r\n        size = b.length;\r\n        result = size == length;\r\n\r\n        if (result || isWhere) {\r\n          // deep compare the contents, ignoring non-numeric properties\r\n          while (size--) {\r\n            var index = length,\r\n                value = b[size];\r\n\r\n            if (isWhere) {\r\n              while (index--) {\r\n                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {\r\n                  break;\r\n                }\r\n              }\r\n            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      else {\r\n        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\r\n        // which, in this case, is more costly\r\n        forIn(b, function(value, key, b) {\r\n          if (hasOwnProperty.call(b, key)) {\r\n            // count the number of properties.\r\n            size++;\r\n            // deep compare each property value.\r\n            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));\r\n          }\r\n        });\r\n\r\n        if (result && !isWhere) {\r\n          // ensure both objects have the same number of properties\r\n          forIn(a, function(value, key, a) {\r\n            if (hasOwnProperty.call(a, key)) {\r\n              // `size` will be `-1` if `a` has more properties than `b`\r\n              return (result = --size > -1);\r\n            }\r\n          });\r\n        }\r\n      }\r\n      stackA.pop();\r\n      stackB.pop();\r\n\r\n      if (initedStack) {\r\n        releaseArray(stackA);\r\n        releaseArray(stackB);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.merge` without argument juggling or support\r\n     * for `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Object} object The destination object.\r\n     * @param {Object} source The source object.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\r\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\r\n     */\r\n    function baseMerge(object, source, callback, stackA, stackB) {\r\n      (isArray(source) ? forEach : forOwn)(source, function(source, key) {\r\n        var found,\r\n            isArr,\r\n            result = source,\r\n            value = object[key];\r\n\r\n        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {\r\n          // avoid merging previously merged cyclic sources\r\n          var stackLength = stackA.length;\r\n          while (stackLength--) {\r\n            if ((found = stackA[stackLength] == source)) {\r\n              value = stackB[stackLength];\r\n              break;\r\n            }\r\n          }\r\n          if (!found) {\r\n            var isShallow;\r\n            if (callback) {\r\n              result = callback(value, source);\r\n              if ((isShallow = typeof result != 'undefined')) {\r\n                value = result;\r\n              }\r\n            }\r\n            if (!isShallow) {\r\n              value = isArr\r\n                ? (isArray(value) ? value : [])\r\n                : (isPlainObject(value) ? value : {});\r\n            }\r\n            // add `source` and associated `value` to the stack of traversed objects\r\n            stackA.push(source);\r\n            stackB.push(value);\r\n\r\n            // recursively merge objects and arrays (susceptible to call stack limits)\r\n            if (!isShallow) {\r\n              baseMerge(value, source, callback, stackA, stackB);\r\n            }\r\n          }\r\n        }\r\n        else {\r\n          if (callback) {\r\n            result = callback(value, source);\r\n            if (typeof result == 'undefined') {\r\n              result = source;\r\n            }\r\n          }\r\n          if (typeof result != 'undefined') {\r\n            value = result;\r\n          }\r\n        }\r\n        object[key] = value;\r\n      });\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.random` without argument juggling or support\r\n     * for returning floating-point numbers.\r\n     *\r\n     * @private\r\n     * @param {number} min The minimum possible value.\r\n     * @param {number} max The maximum possible value.\r\n     * @returns {number} Returns a random number.\r\n     */\r\n    function baseRandom(min, max) {\r\n      return min + floor(nativeRandom() * (max - min + 1));\r\n    }\r\n\r\n    /**\r\n     * The base implementation of `_.uniq` without support for callback shorthands\r\n     * or `thisArg` binding.\r\n     *\r\n     * @private\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function} [callback] The function called per iteration.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     */\r\n    function baseUniq(array, isSorted, callback) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,\r\n          seen = (callback || isLarge) ? getArray() : result;\r\n\r\n      if (isLarge) {\r\n        var cache = createCache(seen);\r\n        indexOf = cacheIndexOf;\r\n        seen = cache;\r\n      }\r\n      while (++index < length) {\r\n        var value = array[index],\r\n            computed = callback ? callback(value, index, array) : value;\r\n\r\n        if (isSorted\r\n              ? !index || seen[seen.length - 1] !== computed\r\n              : indexOf(seen, computed) < 0\r\n            ) {\r\n          if (callback || isLarge) {\r\n            seen.push(computed);\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      if (isLarge) {\r\n        releaseArray(seen.array);\r\n        releaseObject(seen);\r\n      } else if (callback) {\r\n        releaseArray(seen);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that aggregates a collection, creating an object composed\r\n     * of keys generated from the results of running each element of the collection\r\n     * through a callback. The given `setter` function sets the keys and values\r\n     * of the composed object.\r\n     *\r\n     * @private\r\n     * @param {Function} setter The setter function.\r\n     * @returns {Function} Returns the new aggregator function.\r\n     */\r\n    function createAggregator(setter) {\r\n      return function(collection, callback, thisArg) {\r\n        var result = {};\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n        var index = -1,\r\n            length = collection ? collection.length : 0;\r\n\r\n        if (typeof length == 'number') {\r\n          while (++index < length) {\r\n            var value = collection[index];\r\n            setter(result, value, callback(value, index, collection), collection);\r\n          }\r\n        } else {\r\n          forOwn(collection, function(value, key, collection) {\r\n            setter(result, value, callback(value, key, collection), collection);\r\n          });\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, either curries or invokes `func`\r\n     * with an optional `this` binding and partially applied arguments.\r\n     *\r\n     * @private\r\n     * @param {Function|string} func The function or method name to reference.\r\n     * @param {number} bitmask The bitmask of method flags to compose.\r\n     *  The bitmask may be composed of the following flags:\r\n     *  1 - `_.bind`\r\n     *  2 - `_.bindKey`\r\n     *  4 - `_.curry`\r\n     *  8 - `_.curry` (bound)\r\n     *  16 - `_.partial`\r\n     *  32 - `_.partialRight`\r\n     * @param {Array} [partialArgs] An array of arguments to prepend to those\r\n     *  provided to the new function.\r\n     * @param {Array} [partialRightArgs] An array of arguments to append to those\r\n     *  provided to the new function.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {number} [arity] The arity of `func`.\r\n     * @returns {Function} Returns the new function.\r\n     */\r\n    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {\r\n      var isBind = bitmask & 1,\r\n          isBindKey = bitmask & 2,\r\n          isCurry = bitmask & 4,\r\n          isCurryBound = bitmask & 8,\r\n          isPartial = bitmask & 16,\r\n          isPartialRight = bitmask & 32;\r\n\r\n      if (!isBindKey && !isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (isPartial && !partialArgs.length) {\r\n        bitmask &= ~16;\r\n        isPartial = partialArgs = false;\r\n      }\r\n      if (isPartialRight && !partialRightArgs.length) {\r\n        bitmask &= ~32;\r\n        isPartialRight = partialRightArgs = false;\r\n      }\r\n      var bindData = func && func.__bindData__;\r\n      if (bindData && bindData !== true) {\r\n        // clone `bindData`\r\n        bindData = slice(bindData);\r\n        if (bindData[2]) {\r\n          bindData[2] = slice(bindData[2]);\r\n        }\r\n        if (bindData[3]) {\r\n          bindData[3] = slice(bindData[3]);\r\n        }\r\n        // set `thisBinding` is not previously bound\r\n        if (isBind && !(bindData[1] & 1)) {\r\n          bindData[4] = thisArg;\r\n        }\r\n        // set if previously bound but not currently (subsequent curried functions)\r\n        if (!isBind && bindData[1] & 1) {\r\n          bitmask |= 8;\r\n        }\r\n        // set curried arity if not yet set\r\n        if (isCurry && !(bindData[1] & 4)) {\r\n          bindData[5] = arity;\r\n        }\r\n        // append partial left arguments\r\n        if (isPartial) {\r\n          push.apply(bindData[2] || (bindData[2] = []), partialArgs);\r\n        }\r\n        // append partial right arguments\r\n        if (isPartialRight) {\r\n          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);\r\n        }\r\n        // merge flags\r\n        bindData[1] |= bitmask;\r\n        return createWrapper.apply(null, bindData);\r\n      }\r\n      // fast path for `_.bind`\r\n      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;\r\n      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);\r\n    }\r\n\r\n    /**\r\n     * Used by `escape` to convert characters to HTML entities.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to escape.\r\n     * @returns {string} Returns the escaped character.\r\n     */\r\n    function escapeHtmlChar(match) {\r\n      return htmlEscapes[match];\r\n    }\r\n\r\n    /**\r\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\r\n     * customized, this method returns the custom method, otherwise it returns\r\n     * the `baseIndexOf` function.\r\n     *\r\n     * @private\r\n     * @returns {Function} Returns the \"indexOf\" function.\r\n     */\r\n    function getIndexOf() {\r\n      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a native function.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.\r\n     */\r\n    function isNative(value) {\r\n      return typeof value == 'function' && reNative.test(value);\r\n    }\r\n\r\n    /**\r\n     * Sets `this` binding data on a given function.\r\n     *\r\n     * @private\r\n     * @param {Function} func The function to set data on.\r\n     * @param {Array} value The data array to set.\r\n     */\r\n    var setBindData = !defineProperty ? noop : function(func, value) {\r\n      descriptor.value = value;\r\n      defineProperty(func, '__bindData__', descriptor);\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `isPlainObject` which checks if a given value\r\n     * is an object created by the `Object` constructor, assuming objects created\r\n     * by the `Object` constructor have no inherited enumerable properties and that\r\n     * there are no `Object.prototype` extensions.\r\n     *\r\n     * @private\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     */\r\n    function shimIsPlainObject(value) {\r\n      var ctor,\r\n          result;\r\n\r\n      // avoid non Object objects, `arguments` objects, and DOM elements\r\n      if (!(value && toString.call(value) == objectClass) ||\r\n          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {\r\n        return false;\r\n      }\r\n      // In most environments an object's own properties are iterated before\r\n      // its inherited properties. If the last iterated property is an object's\r\n      // own property then there are no inherited enumerable properties.\r\n      forIn(value, function(value, key) {\r\n        result = key;\r\n      });\r\n      return typeof result == 'undefined' || hasOwnProperty.call(value, result);\r\n    }\r\n\r\n    /**\r\n     * Used by `unescape` to convert HTML entities to characters.\r\n     *\r\n     * @private\r\n     * @param {string} match The matched character to unescape.\r\n     * @returns {string} Returns the unescaped character.\r\n     */\r\n    function unescapeHtmlChar(match) {\r\n      return htmlUnescapes[match];\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Checks if `value` is an `arguments` object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArguments(arguments); })(1, 2, 3);\r\n     * // => true\r\n     *\r\n     * _.isArguments([1, 2, 3]);\r\n     * // => false\r\n     */\r\n    function isArguments(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == argsClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.\r\n     * @example\r\n     *\r\n     * (function() { return _.isArray(arguments); })();\r\n     * // => false\r\n     *\r\n     * _.isArray([1, 2, 3]);\r\n     * // => true\r\n     */\r\n    var isArray = nativeIsArray || function(value) {\r\n      return value && typeof value == 'object' && typeof value.length == 'number' &&\r\n        toString.call(value) == arrayClass || false;\r\n    };\r\n\r\n    /**\r\n     * A fallback implementation of `Object.keys` which produces an array of the\r\n     * given object's own enumerable property names.\r\n     *\r\n     * @private\r\n     * @type Function\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     */\r\n    var shimKeys = function(object) {\r\n      var index, iterable = object, result = [];\r\n      if (!iterable) return result;\r\n      if (!(objectTypes[typeof object])) return result;\r\n        for (index in iterable) {\r\n          if (hasOwnProperty.call(iterable, index)) {\r\n            result.push(index);\r\n          }\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property names of an object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names.\r\n     * @example\r\n     *\r\n     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)\r\n     */\r\n    var keys = !nativeKeys ? shimKeys : function(object) {\r\n      if (!isObject(object)) {\r\n        return [];\r\n      }\r\n      return nativeKeys(object);\r\n    };\r\n\r\n    /**\r\n     * Used to convert characters to HTML entities:\r\n     *\r\n     * Though the `>` character is escaped for symmetry, characters like `>` and `/`\r\n     * don't require escaping in HTML and have no special meaning unless they're part\r\n     * of a tag or an unquoted attribute value.\r\n     * http://mathiasbynens.be/notes/ambiguous-ampersands (under \"semi-related fun fact\")\r\n     */\r\n    var htmlEscapes = {\r\n      '&': '&amp;',\r\n      '<': '&lt;',\r\n      '>': '&gt;',\r\n      '\"': '&quot;',\r\n      \"'\": '&#39;'\r\n    };\r\n\r\n    /** Used to convert HTML entities to characters */\r\n    var htmlUnescapes = invert(htmlEscapes);\r\n\r\n    /** Used to match HTML entities and HTML characters */\r\n    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),\r\n        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object. Subsequent sources will overwrite property assignments of previous\r\n     * sources. If a callback is provided it will be executed to produce the\r\n     * assigned values. The callback is bound to `thisArg` and invoked with two\r\n     * arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @alias extend\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize assigning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });\r\n     * // => { 'name': 'fred', 'employer': 'slate' }\r\n     *\r\n     * var defaults = _.partialRight(_.assign, function(a, b) {\r\n     *   return typeof a == 'undefined' ? b : a;\r\n     * });\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var assign = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\r\n      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\r\n        callback = args[--argsLength];\r\n      }\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also\r\n     * be cloned, otherwise they will be assigned by reference. If a callback\r\n     * is provided it will be executed to produce the cloned values. If the\r\n     * callback returns `undefined` cloning will be handled by the method instead.\r\n     * The callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to clone.\r\n     * @param {boolean} [isDeep=false] Specify a deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var shallow = _.clone(characters);\r\n     * shallow[0] === characters[0];\r\n     * // => true\r\n     *\r\n     * var deep = _.clone(characters, true);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * _.mixin({\r\n     *   'clone': _.partialRight(_.clone, function(value) {\r\n     *     return _.isElement(value) ? value.cloneNode(false) : undefined;\r\n     *   })\r\n     * });\r\n     *\r\n     * var clone = _.clone(document.body);\r\n     * clone.childNodes.length;\r\n     * // => 0\r\n     */\r\n    function clone(value, isDeep, callback, thisArg) {\r\n      // allows working with \"Collections\" methods without using their `index`\r\n      // and `collection` arguments for `isDeep` and `callback`\r\n      if (typeof isDeep != 'boolean' && isDeep != null) {\r\n        thisArg = callback;\r\n        callback = isDeep;\r\n        isDeep = false;\r\n      }\r\n      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a deep clone of `value`. If a callback is provided it will be\r\n     * executed to produce the cloned values. If the callback returns `undefined`\r\n     * cloning will be handled by the method instead. The callback is bound to\r\n     * `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * Note: This method is loosely based on the structured clone algorithm. Functions\r\n     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and\r\n     * objects created by constructors other than `Object` are cloned to plain `Object` objects.\r\n     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to deep clone.\r\n     * @param {Function} [callback] The function to customize cloning values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the deep cloned value.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * var deep = _.cloneDeep(characters);\r\n     * deep[0] === characters[0];\r\n     * // => false\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'node': element\r\n     * };\r\n     *\r\n     * var clone = _.cloneDeep(view, function(value) {\r\n     *   return _.isElement(value) ? value.cloneNode(true) : undefined;\r\n     * });\r\n     *\r\n     * clone.node == view.node;\r\n     * // => false\r\n     */\r\n    function cloneDeep(value, callback, thisArg) {\r\n      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an object that inherits from the given `prototype` object. If a\r\n     * `properties` object is provided its own enumerable properties are assigned\r\n     * to the created object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} prototype The object to inherit from.\r\n     * @param {Object} [properties] The properties to assign to the object.\r\n     * @returns {Object} Returns the new object.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * function Circle() {\r\n     *   Shape.call(this);\r\n     * }\r\n     *\r\n     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });\r\n     *\r\n     * var circle = new Circle;\r\n     * circle instanceof Circle;\r\n     * // => true\r\n     *\r\n     * circle instanceof Shape;\r\n     * // => true\r\n     */\r\n    function create(prototype, properties) {\r\n      var result = baseCreate(prototype);\r\n      return properties ? assign(result, properties) : result;\r\n    }\r\n\r\n    /**\r\n     * Assigns own enumerable properties of source object(s) to the destination\r\n     * object for all destination properties that resolve to `undefined`. Once a\r\n     * property is set, additional defaults of the same property will be ignored.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param- {Object} [guard] Allows working with `_.reduce` without using its\r\n     *  `key` and `object` arguments as sources.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'barney' };\r\n     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });\r\n     * // => { 'name': 'barney', 'employer': 'slate' }\r\n     */\r\n    var defaults = function(object, source, guard) {\r\n      var index, iterable = object, result = iterable;\r\n      if (!iterable) return result;\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = typeof guard == 'number' ? 2 : args.length;\r\n      while (++argsIndex < argsLength) {\r\n        iterable = args[argsIndex];\r\n        if (iterable && objectTypes[typeof iterable]) {\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (typeof result[index] == 'undefined') result[index] = iterable[index];\r\n        }\r\n        }\r\n      }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it returns the key of the\r\n     * first element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': false },\r\n     *   'fred': {    'age': 40, 'blocked': true },\r\n     *   'pebbles': { 'age': 1,  'blocked': false }\r\n     * };\r\n     *\r\n     * _.findKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => 'barney' (property order is not guaranteed across environments)\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findKey(characters, { 'age': 1 });\r\n     * // => 'pebbles'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findKey(characters, 'blocked');\r\n     * // => 'fred'\r\n     */\r\n    function findKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwn(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findKey` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called per\r\n     *  iteration. If a property name or object is provided it will be used to\r\n     *  create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {string|undefined} Returns the key of the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = {\r\n     *   'barney': {  'age': 36, 'blocked': true },\r\n     *   'fred': {    'age': 40, 'blocked': false },\r\n     *   'pebbles': { 'age': 1,  'blocked': true }\r\n     * };\r\n     *\r\n     * _.findLastKey(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => returns `pebbles`, assuming `_.findKey` returns `barney`\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastKey(characters, { 'age': 40 });\r\n     * // => 'fred'\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastKey(characters, 'blocked');\r\n     * // => 'pebbles'\r\n     */\r\n    function findLastKey(object, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forOwnRight(object, function(value, key, object) {\r\n        if (callback(value, key, object)) {\r\n          result = key;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own and inherited enumerable properties of an object,\r\n     * executing the callback for each property. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, key, object). Callbacks may exit\r\n     * iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forIn(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)\r\n     */\r\n    var forIn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        for (index in iterable) {\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forIn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * Shape.prototype.move = function(x, y) {\r\n     *   this.x += x;\r\n     *   this.y += y;\r\n     * };\r\n     *\r\n     * _.forInRight(new Shape, function(value, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'\r\n     */\r\n    function forInRight(object, callback, thisArg) {\r\n      var pairs = [];\r\n\r\n      forIn(object, function(value, key) {\r\n        pairs.push(key, value);\r\n      });\r\n\r\n      var length = pairs.length;\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(pairs[length--], pairs[length], object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Iterates over own enumerable properties of an object, executing the callback\r\n     * for each property. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, key, object). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)\r\n     */\r\n    var forOwn = function(collection, callback, thisArg) {\r\n      var index, iterable = collection, result = iterable;\r\n      if (!iterable) return result;\r\n      if (!objectTypes[typeof iterable]) return result;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n        var ownIndex = -1,\r\n            ownProps = objectTypes[typeof iterable] && keys(iterable),\r\n            length = ownProps ? ownProps.length : 0;\r\n\r\n        while (++ownIndex < length) {\r\n          index = ownProps[ownIndex];\r\n          if (callback(iterable[index], index, collection) === false) return result;\r\n        }\r\n      return result\r\n    };\r\n\r\n    /**\r\n     * This method is like `_.forOwn` except that it iterates over elements\r\n     * of a `collection` in the opposite order.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {\r\n     *   console.log(key);\r\n     * });\r\n     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'\r\n     */\r\n    function forOwnRight(object, callback, thisArg) {\r\n      var props = keys(object),\r\n          length = props.length;\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        var key = props[length];\r\n        if (callback(object[key], key, object) === false) {\r\n          break;\r\n        }\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a sorted array of property names of all enumerable properties,\r\n     * own and inherited, of `object` that have function values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias methods\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property names that have function values.\r\n     * @example\r\n     *\r\n     * _.functions(_);\r\n     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]\r\n     */\r\n    function functions(object) {\r\n      var result = [];\r\n      forIn(object, function(value, key) {\r\n        if (isFunction(value)) {\r\n          result.push(key);\r\n        }\r\n      });\r\n      return result.sort();\r\n    }\r\n\r\n    /**\r\n     * Checks if the specified property name exists as a direct property of `object`,\r\n     * instead of an inherited property.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to check.\r\n     * @returns {boolean} Returns `true` if key is a direct property, else `false`.\r\n     * @example\r\n     *\r\n     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');\r\n     * // => true\r\n     */\r\n    function has(object, key) {\r\n      return object ? hasOwnProperty.call(object, key) : false;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of the inverted keys and values of the given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to invert.\r\n     * @returns {Object} Returns the created inverted object.\r\n     * @example\r\n     *\r\n     * _.invert({ 'first': 'fred', 'second': 'barney' });\r\n     * // => { 'fred': 'first', 'barney': 'second' }\r\n     */\r\n    function invert(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = {};\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[object[key]] = key;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a boolean value.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.\r\n     * @example\r\n     *\r\n     * _.isBoolean(null);\r\n     * // => false\r\n     */\r\n    function isBoolean(value) {\r\n      return value === true || value === false ||\r\n        value && typeof value == 'object' && toString.call(value) == boolClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a date.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.\r\n     * @example\r\n     *\r\n     * _.isDate(new Date);\r\n     * // => true\r\n     */\r\n    function isDate(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == dateClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a DOM element.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.\r\n     * @example\r\n     *\r\n     * _.isElement(document.body);\r\n     * // => true\r\n     */\r\n    function isElement(value) {\r\n      return value && value.nodeType === 1 || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a\r\n     * length of `0` and objects with no own enumerable properties are considered\r\n     * \"empty\".\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object|string} value The value to inspect.\r\n     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.\r\n     * @example\r\n     *\r\n     * _.isEmpty([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isEmpty({});\r\n     * // => true\r\n     *\r\n     * _.isEmpty('');\r\n     * // => true\r\n     */\r\n    function isEmpty(value) {\r\n      var result = true;\r\n      if (!value) {\r\n        return result;\r\n      }\r\n      var className = toString.call(value),\r\n          length = value.length;\r\n\r\n      if ((className == arrayClass || className == stringClass || className == argsClass ) ||\r\n          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {\r\n        return !length;\r\n      }\r\n      forOwn(value, function() {\r\n        return (result = false);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison between two values to determine if they are\r\n     * equivalent to each other. If a callback is provided it will be executed\r\n     * to compare values. If the callback returns `undefined` comparisons will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (a, b).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} a The value to compare.\r\n     * @param {*} b The other value to compare.\r\n     * @param {Function} [callback] The function to customize comparing values.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var copy = { 'name': 'fred' };\r\n     *\r\n     * object == copy;\r\n     * // => false\r\n     *\r\n     * _.isEqual(object, copy);\r\n     * // => true\r\n     *\r\n     * var words = ['hello', 'goodbye'];\r\n     * var otherWords = ['hi', 'goodbye'];\r\n     *\r\n     * _.isEqual(words, otherWords, function(a, b) {\r\n     *   var reGreet = /^(?:hello|hi)$/i,\r\n     *       aGreet = _.isString(a) && reGreet.test(a),\r\n     *       bGreet = _.isString(b) && reGreet.test(b);\r\n     *\r\n     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;\r\n     * });\r\n     * // => true\r\n     */\r\n    function isEqual(a, b, callback, thisArg) {\r\n      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is, or can be coerced to, a finite number.\r\n     *\r\n     * Note: This is not the same as native `isFinite` which will return true for\r\n     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFinite(-101);\r\n     * // => true\r\n     *\r\n     * _.isFinite('10');\r\n     * // => true\r\n     *\r\n     * _.isFinite(true);\r\n     * // => false\r\n     *\r\n     * _.isFinite('');\r\n     * // => false\r\n     *\r\n     * _.isFinite(Infinity);\r\n     * // => false\r\n     */\r\n    function isFinite(value) {\r\n      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.\r\n     * @example\r\n     *\r\n     * _.isFunction(_);\r\n     * // => true\r\n     */\r\n    function isFunction(value) {\r\n      return typeof value == 'function';\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is the language type of Object.\r\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.\r\n     * @example\r\n     *\r\n     * _.isObject({});\r\n     * // => true\r\n     *\r\n     * _.isObject([1, 2, 3]);\r\n     * // => true\r\n     *\r\n     * _.isObject(1);\r\n     * // => false\r\n     */\r\n    function isObject(value) {\r\n      // check if the value is the ECMAScript language type of Object\r\n      // http://es5.github.io/#x8\r\n      // and avoid a V8 bug\r\n      // http://code.google.com/p/v8/issues/detail?id=2291\r\n      return !!(value && objectTypes[typeof value]);\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `NaN`.\r\n     *\r\n     * Note: This is not the same as native `isNaN` which will return `true` for\r\n     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNaN(NaN);\r\n     * // => true\r\n     *\r\n     * _.isNaN(new Number(NaN));\r\n     * // => true\r\n     *\r\n     * isNaN(undefined);\r\n     * // => true\r\n     *\r\n     * _.isNaN(undefined);\r\n     * // => false\r\n     */\r\n    function isNaN(value) {\r\n      // `NaN` as a primitive is the only value that is not equal to itself\r\n      // (perform the [[Class]] check first to avoid errors with some host objects in IE)\r\n      return isNumber(value) && value != +value;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `null`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNull(null);\r\n     * // => true\r\n     *\r\n     * _.isNull(undefined);\r\n     * // => false\r\n     */\r\n    function isNull(value) {\r\n      return value === null;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a number.\r\n     *\r\n     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.\r\n     * @example\r\n     *\r\n     * _.isNumber(8.4 * 5);\r\n     * // => true\r\n     */\r\n    function isNumber(value) {\r\n      return typeof value == 'number' ||\r\n        value && typeof value == 'object' && toString.call(value) == numberClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is an object created by the `Object` constructor.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\r\n     * @example\r\n     *\r\n     * function Shape() {\r\n     *   this.x = 0;\r\n     *   this.y = 0;\r\n     * }\r\n     *\r\n     * _.isPlainObject(new Shape);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject([1, 2, 3]);\r\n     * // => false\r\n     *\r\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\r\n     * // => true\r\n     */\r\n    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\r\n      if (!(value && toString.call(value) == objectClass)) {\r\n        return false;\r\n      }\r\n      var valueOf = value.valueOf,\r\n          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\r\n\r\n      return objProto\r\n        ? (value == objProto || getPrototypeOf(value) == objProto)\r\n        : shimIsPlainObject(value);\r\n    };\r\n\r\n    /**\r\n     * Checks if `value` is a regular expression.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.\r\n     * @example\r\n     *\r\n     * _.isRegExp(/fred/);\r\n     * // => true\r\n     */\r\n    function isRegExp(value) {\r\n      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is a string.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.\r\n     * @example\r\n     *\r\n     * _.isString('fred');\r\n     * // => true\r\n     */\r\n    function isString(value) {\r\n      return typeof value == 'string' ||\r\n        value && typeof value == 'object' && toString.call(value) == stringClass || false;\r\n    }\r\n\r\n    /**\r\n     * Checks if `value` is `undefined`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {*} value The value to check.\r\n     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.\r\n     * @example\r\n     *\r\n     * _.isUndefined(void 0);\r\n     * // => true\r\n     */\r\n    function isUndefined(value) {\r\n      return typeof value == 'undefined';\r\n    }\r\n\r\n    /**\r\n     * Creates an object with the same keys as `object` and values generated by\r\n     * running each own enumerable property of `object` through the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new object with values of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     *\r\n     * var characters = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.mapValues(characters, 'age');\r\n     * // => { 'fred': 40, 'pebbles': 1 }\r\n     */\r\n    function mapValues(object, callback, thisArg) {\r\n      var result = {};\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      forOwn(object, function(value, key, object) {\r\n        result[key] = callback(value, key, object);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Recursively merges own enumerable properties of the source object(s), that\r\n     * don't resolve to `undefined` into the destination object. Subsequent sources\r\n     * will overwrite property assignments of previous sources. If a callback is\r\n     * provided it will be executed to produce the merged values of the destination\r\n     * and source properties. If the callback returns `undefined` merging will\r\n     * be handled by the method instead. The callback is bound to `thisArg` and\r\n     * invoked with two arguments; (objectValue, sourceValue).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The destination object.\r\n     * @param {...Object} [source] The source objects.\r\n     * @param {Function} [callback] The function to customize merging properties.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the destination object.\r\n     * @example\r\n     *\r\n     * var names = {\r\n     *   'characters': [\r\n     *     { 'name': 'barney' },\r\n     *     { 'name': 'fred' }\r\n     *   ]\r\n     * };\r\n     *\r\n     * var ages = {\r\n     *   'characters': [\r\n     *     { 'age': 36 },\r\n     *     { 'age': 40 }\r\n     *   ]\r\n     * };\r\n     *\r\n     * _.merge(names, ages);\r\n     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }\r\n     *\r\n     * var food = {\r\n     *   'fruits': ['apple'],\r\n     *   'vegetables': ['beet']\r\n     * };\r\n     *\r\n     * var otherFood = {\r\n     *   'fruits': ['banana'],\r\n     *   'vegetables': ['carrot']\r\n     * };\r\n     *\r\n     * _.merge(food, otherFood, function(a, b) {\r\n     *   return _.isArray(a) ? a.concat(b) : undefined;\r\n     * });\r\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }\r\n     */\r\n    function merge(object) {\r\n      var args = arguments,\r\n          length = 2;\r\n\r\n      if (!isObject(object)) {\r\n        return object;\r\n      }\r\n      // allows working with `_.reduce` and `_.reduceRight` without using\r\n      // their `index` and `collection` arguments\r\n      if (typeof args[2] != 'number') {\r\n        length = args.length;\r\n      }\r\n      if (length > 3 && typeof args[length - 2] == 'function') {\r\n        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);\r\n      } else if (length > 2 && typeof args[length - 1] == 'function') {\r\n        callback = args[--length];\r\n      }\r\n      var sources = slice(arguments, 1, length),\r\n          index = -1,\r\n          stackA = getArray(),\r\n          stackB = getArray();\r\n\r\n      while (++index < length) {\r\n        baseMerge(object, sources[index], callback, stackA, stackB);\r\n      }\r\n      releaseArray(stackA);\r\n      releaseArray(stackB);\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` excluding the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` omitting the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The properties to omit or the\r\n     *  function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object without the omitted properties.\r\n     * @example\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {\r\n     *   return typeof value == 'number';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function omit(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var props = [];\r\n        forIn(object, function(value, key) {\r\n          props.push(key);\r\n        });\r\n        props = baseDifference(props, baseFlatten(arguments, true, false, 1));\r\n\r\n        var index = -1,\r\n            length = props.length;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          result[key] = object[key];\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (!callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a two dimensional array of an object's key-value pairs,\r\n     * i.e. `[[key1, value1], [key2, value2]]`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns new array of key-value pairs.\r\n     * @example\r\n     *\r\n     * _.pairs({ 'barney': 36, 'fred': 40 });\r\n     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)\r\n     */\r\n    function pairs(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        var key = props[index];\r\n        result[index] = [key, object[key]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates a shallow clone of `object` composed of the specified properties.\r\n     * Property names may be specified as individual arguments or as arrays of\r\n     * property names. If a callback is provided it will be executed for each\r\n     * property of `object` picking the properties the callback returns truey\r\n     * for. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, key, object).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The source object.\r\n     * @param {Function|...string|string[]} [callback] The function called per\r\n     *  iteration or property names to pick, specified as individual property\r\n     *  names or arrays of property names.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns an object composed of the picked properties.\r\n     * @example\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');\r\n     * // => { 'name': 'fred' }\r\n     *\r\n     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {\r\n     *   return key.charAt(0) != '_';\r\n     * });\r\n     * // => { 'name': 'fred' }\r\n     */\r\n    function pick(object, callback, thisArg) {\r\n      var result = {};\r\n      if (typeof callback != 'function') {\r\n        var index = -1,\r\n            props = baseFlatten(arguments, true, false, 1),\r\n            length = isObject(object) ? props.length : 0;\r\n\r\n        while (++index < length) {\r\n          var key = props[index];\r\n          if (key in object) {\r\n            result[key] = object[key];\r\n          }\r\n        }\r\n      } else {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        forIn(object, function(value, key, object) {\r\n          if (callback(value, key, object)) {\r\n            result[key] = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * An alternative to `_.reduce` this method transforms `object` to a new\r\n     * `accumulator` object which is the result of running each of its own\r\n     * enumerable properties through a callback, with each callback execution\r\n     * potentially mutating the `accumulator` object. The callback is bound to\r\n     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).\r\n     * Callbacks may exit iteration early by explicitly returning `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Array|Object} object The object to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] The custom accumulator value.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {\r\n     *   num *= num;\r\n     *   if (num % 2) {\r\n     *     return result.push(num) < 3;\r\n     *   }\r\n     * });\r\n     * // => [1, 9, 25]\r\n     *\r\n     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     * });\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function transform(object, callback, accumulator, thisArg) {\r\n      var isArr = isArray(object);\r\n      if (accumulator == null) {\r\n        if (isArr) {\r\n          accumulator = [];\r\n        } else {\r\n          var ctor = object && object.constructor,\r\n              proto = ctor && ctor.prototype;\r\n\r\n          accumulator = baseCreate(proto);\r\n        }\r\n      }\r\n      if (callback) {\r\n        callback = lodash.createCallback(callback, thisArg, 4);\r\n        (isArr ? forEach : forOwn)(object, function(value, index, object) {\r\n          return callback(accumulator, value, index, object);\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * Creates an array composed of the own enumerable property values of `object`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Objects\r\n     * @param {Object} object The object to inspect.\r\n     * @returns {Array} Returns an array of property values.\r\n     * @example\r\n     *\r\n     * _.values({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => [1, 2, 3] (property order is not guaranteed across environments)\r\n     */\r\n    function values(object) {\r\n      var index = -1,\r\n          props = keys(object),\r\n          length = props.length,\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = object[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array of elements from the specified indexes, or keys, of the\r\n     * `collection`. Indexes may be specified as individual arguments or as arrays\r\n     * of indexes.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`\r\n     *   to retrieve, specified as individual indexes or arrays of indexes.\r\n     * @returns {Array} Returns a new array of elements corresponding to the\r\n     *  provided indexes.\r\n     * @example\r\n     *\r\n     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);\r\n     * // => ['a', 'c', 'e']\r\n     *\r\n     * _.at(['fred', 'barney', 'pebbles'], 0, 2);\r\n     * // => ['fred', 'pebbles']\r\n     */\r\n    function at(collection) {\r\n      var args = arguments,\r\n          index = -1,\r\n          props = baseFlatten(args, true, false, 1),\r\n          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,\r\n          result = Array(length);\r\n\r\n      while(++index < length) {\r\n        result[index] = collection[props[index]];\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Checks if a given value is present in a collection using strict equality\r\n     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the\r\n     * offset from the end of the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias include\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {*} target The value to check for.\r\n     * @param {number} [fromIndex=0] The index to search from.\r\n     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.\r\n     * @example\r\n     *\r\n     * _.contains([1, 2, 3], 1);\r\n     * // => true\r\n     *\r\n     * _.contains([1, 2, 3], 1, 2);\r\n     * // => false\r\n     *\r\n     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');\r\n     * // => true\r\n     *\r\n     * _.contains('pebbles', 'eb');\r\n     * // => true\r\n     */\r\n    function contains(collection, target, fromIndex) {\r\n      var index = -1,\r\n          indexOf = getIndexOf(),\r\n          length = collection ? collection.length : 0,\r\n          result = false;\r\n\r\n      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;\r\n      if (isArray(collection)) {\r\n        result = indexOf(collection, target, fromIndex) > -1;\r\n      } else if (typeof length == 'number') {\r\n        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;\r\n      } else {\r\n        forOwn(collection, function(value) {\r\n          if (++index >= fromIndex) {\r\n            return !(result = value === target);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of `collection` through the callback. The corresponding value\r\n     * of each key is the number of times the key was returned by the callback.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': 1, '6': 2 }\r\n     *\r\n     * _.countBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': 2, '5': 1 }\r\n     */\r\n    var countBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);\r\n    });\r\n\r\n    /**\r\n     * Checks if the given callback returns truey value for **all** elements of\r\n     * a collection. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias all\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if all elements passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.every([true, 1, null, 'yes']);\r\n     * // => false\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.every(characters, 'age');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.every(characters, { 'age': 36 });\r\n     * // => false\r\n     */\r\n    function every(collection, callback, thisArg) {\r\n      var result = true;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (!(result = !!callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return (result = !!callback(value, index, collection));\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning an array of all elements\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias select\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that passed the callback check.\r\n     * @example\r\n     *\r\n     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [2, 4, 6]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.filter(characters, 'blocked');\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.filter(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     */\r\n    function filter(collection, callback, thisArg) {\r\n      var result = [];\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result.push(value);\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, returning the first element that\r\n     * the callback returns truey for. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias detect, findWhere\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.find(characters, function(chr) {\r\n     *   return chr.age < 40;\r\n     * });\r\n     * // => { 'name': 'barney', 'age': 36, 'blocked': false }\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.find(characters, { 'age': 1 });\r\n     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.find(characters, 'blocked');\r\n     * // => { 'name': 'fred', 'age': 40, 'blocked': true }\r\n     */\r\n    function find(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (callback(value, index, collection)) {\r\n            return value;\r\n          }\r\n        }\r\n      } else {\r\n        var result;\r\n        forOwn(collection, function(value, index, collection) {\r\n          if (callback(value, index, collection)) {\r\n            result = value;\r\n            return false;\r\n          }\r\n        });\r\n        return result;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the found element, else `undefined`.\r\n     * @example\r\n     *\r\n     * _.findLast([1, 2, 3, 4], function(num) {\r\n     *   return num % 2 == 1;\r\n     * });\r\n     * // => 3\r\n     */\r\n    function findLast(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        if (callback(value, index, collection)) {\r\n          result = value;\r\n          return false;\r\n        }\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Iterates over elements of a collection, executing the callback for each\r\n     * element. The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection). Callbacks may exit iteration early by\r\n     * explicitly returning `false`.\r\n     *\r\n     * Note: As with other \"Collections\" methods, objects with a `length` property\r\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\r\n     * may be used for object iteration.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias each\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number and returns '1,2,3'\r\n     *\r\n     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });\r\n     * // => logs each number and returns the object (property order is not guaranteed across environments)\r\n     */\r\n    function forEach(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if (callback(collection[index], index, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, callback);\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.forEach` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias eachRight\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array|Object|string} Returns `collection`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');\r\n     * // => logs each number from right to left and returns '3,2,1'\r\n     */\r\n    function forEachRight(collection, callback, thisArg) {\r\n      var length = collection ? collection.length : 0;\r\n      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        while (length--) {\r\n          if (callback(collection[length], length, collection) === false) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        var props = keys(collection);\r\n        length = props.length;\r\n        forOwn(collection, function(value, key, collection) {\r\n          key = props ? props[--length] : --length;\r\n          return callback(collection[key], key, collection);\r\n        });\r\n      }\r\n      return collection;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of a collection through the callback. The corresponding value\r\n     * of each key is an array of the elements responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);\r\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.groupBy(['one', 'two', 'three'], 'length');\r\n     * // => { '3': ['one', 'two'], '5': ['three'] }\r\n     */\r\n    var groupBy = createAggregator(function(result, value, key) {\r\n      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);\r\n    });\r\n\r\n    /**\r\n     * Creates an object composed of keys generated from the results of running\r\n     * each element of the collection through the given callback. The corresponding\r\n     * value of each key is the last element responsible for generating the key.\r\n     * The callback is bound to `thisArg` and invoked with three arguments;\r\n     * (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Object} Returns the composed aggregate object.\r\n     * @example\r\n     *\r\n     * var keys = [\r\n     *   { 'dir': 'left', 'code': 97 },\r\n     *   { 'dir': 'right', 'code': 100 }\r\n     * ];\r\n     *\r\n     * _.indexBy(keys, 'dir');\r\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     *\r\n     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);\r\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\r\n     */\r\n    var indexBy = createAggregator(function(result, value, key) {\r\n      result[key] = value;\r\n    });\r\n\r\n    /**\r\n     * Invokes the method named by `methodName` on each element in the `collection`\r\n     * returning an array of the results of each invoked method. Additional arguments\r\n     * will be provided to each invoked method. If `methodName` is a function it\r\n     * will be invoked for, and `this` bound to, each element in the `collection`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|string} methodName The name of the method to invoke or\r\n     *  the function invoked per iteration.\r\n     * @param {...*} [arg] Arguments to invoke the method with.\r\n     * @returns {Array} Returns a new array of the results of each invoked method.\r\n     * @example\r\n     *\r\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\r\n     * // => [[1, 5, 7], [1, 2, 3]]\r\n     *\r\n     * _.invoke([123, 456], String.prototype.split, '');\r\n     * // => [['1', '2', '3'], ['4', '5', '6']]\r\n     */\r\n    function invoke(collection, methodName) {\r\n      var args = slice(arguments, 2),\r\n          index = -1,\r\n          isFunc = typeof methodName == 'function',\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of values by running each element in the collection\r\n     * through the callback. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias collect\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * _.map([1, 2, 3], function(num) { return num * 3; });\r\n     * // => [3, 6, 9]\r\n     *\r\n     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });\r\n     * // => [3, 6, 9] (property order is not guaranteed across environments)\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function map(collection, callback, thisArg) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      if (typeof length == 'number') {\r\n        var result = Array(length);\r\n        while (++index < length) {\r\n          result[index] = callback(collection[index], index, collection);\r\n        }\r\n      } else {\r\n        result = [];\r\n        forOwn(collection, function(value, key, collection) {\r\n          result[++index] = callback(value, key, collection);\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the maximum value of a collection. If the collection is empty or\r\n     * falsey `-Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the maximum value.\r\n     * @example\r\n     *\r\n     * _.max([4, 2, 8, 6]);\r\n     * // => 8\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.max(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.max(characters, 'age');\r\n     * // => { 'name': 'fred', 'age': 40 };\r\n     */\r\n    function max(collection, callback, thisArg) {\r\n      var computed = -Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value > result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current > computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the minimum value of a collection. If the collection is empty or\r\n     * falsey `Infinity` is returned. If a callback is provided it will be executed\r\n     * for each value in the collection to generate the criterion by which the value\r\n     * is ranked. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the minimum value.\r\n     * @example\r\n     *\r\n     * _.min([4, 2, 8, 6]);\r\n     * // => 2\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.min(characters, function(chr) { return chr.age; });\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.min(characters, 'age');\r\n     * // => { 'name': 'barney', 'age': 36 };\r\n     */\r\n    function min(collection, callback, thisArg) {\r\n      var computed = Infinity,\r\n          result = computed;\r\n\r\n      // allows working with functions like `_.map` without using\r\n      // their `index` argument as a callback\r\n      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {\r\n        callback = null;\r\n      }\r\n      if (callback == null && isArray(collection)) {\r\n        var index = -1,\r\n            length = collection.length;\r\n\r\n        while (++index < length) {\r\n          var value = collection[index];\r\n          if (value < result) {\r\n            result = value;\r\n          }\r\n        }\r\n      } else {\r\n        callback = (callback == null && isString(collection))\r\n          ? charAtCallback\r\n          : lodash.createCallback(callback, thisArg, 3);\r\n\r\n        forEach(collection, function(value, index, collection) {\r\n          var current = callback(value, index, collection);\r\n          if (current < computed) {\r\n            computed = current;\r\n            result = value;\r\n          }\r\n        });\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Retrieves the value of a specified property from all elements in the collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {string} property The name of the property to pluck.\r\n     * @returns {Array} Returns a new array of property values.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * _.pluck(characters, 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    var pluck = map;\r\n\r\n    /**\r\n     * Reduces a collection to a value which is the accumulated result of running\r\n     * each element in the collection through the callback, where each successive\r\n     * callback execution consumes the return value of the previous execution. If\r\n     * `accumulator` is not provided the first element of the collection will be\r\n     * used as the initial `accumulator` value. The callback is bound to `thisArg`\r\n     * and invoked with four arguments; (accumulator, value, index|key, collection).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldl, inject\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var sum = _.reduce([1, 2, 3], function(sum, num) {\r\n     *   return sum + num;\r\n     * });\r\n     * // => 6\r\n     *\r\n     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {\r\n     *   result[key] = num * 3;\r\n     *   return result;\r\n     * }, {});\r\n     * // => { 'a': 3, 'b': 6, 'c': 9 }\r\n     */\r\n    function reduce(collection, callback, accumulator, thisArg) {\r\n      if (!collection) return accumulator;\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n\r\n      var index = -1,\r\n          length = collection.length;\r\n\r\n      if (typeof length == 'number') {\r\n        if (noaccum) {\r\n          accumulator = collection[++index];\r\n        }\r\n        while (++index < length) {\r\n          accumulator = callback(accumulator, collection[index], index, collection);\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          accumulator = noaccum\r\n            ? (noaccum = false, value)\r\n            : callback(accumulator, value, index, collection)\r\n        });\r\n      }\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.reduce` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias foldr\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function} [callback=identity] The function called per iteration.\r\n     * @param {*} [accumulator] Initial value of the accumulator.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the accumulated value.\r\n     * @example\r\n     *\r\n     * var list = [[0, 1], [2, 3], [4, 5]];\r\n     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);\r\n     * // => [4, 5, 2, 3, 0, 1]\r\n     */\r\n    function reduceRight(collection, callback, accumulator, thisArg) {\r\n      var noaccum = arguments.length < 3;\r\n      callback = lodash.createCallback(callback, thisArg, 4);\r\n      forEachRight(collection, function(value, index, collection) {\r\n        accumulator = noaccum\r\n          ? (noaccum = false, value)\r\n          : callback(accumulator, value, index, collection);\r\n      });\r\n      return accumulator;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.filter` this method returns the elements of a\r\n     * collection that the callback does **not** return truey for.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of elements that failed the callback check.\r\n     * @example\r\n     *\r\n     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });\r\n     * // => [1, 3, 5]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.reject(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.reject(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]\r\n     */\r\n    function reject(collection, callback, thisArg) {\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      return filter(collection, function(value, index, collection) {\r\n        return !callback(value, index, collection);\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Retrieves a random element or `n` random elements from a collection.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to sample.\r\n     * @param {number} [n] The number of elements to sample.\r\n     * @param- {Object} [guard] Allows working with functions like `_.map`\r\n     *  without using their `index` arguments as `n`.\r\n     * @returns {Array} Returns the random sample(s) of `collection`.\r\n     * @example\r\n     *\r\n     * _.sample([1, 2, 3, 4]);\r\n     * // => 2\r\n     *\r\n     * _.sample([1, 2, 3, 4], 2);\r\n     * // => [3, 1]\r\n     */\r\n    function sample(collection, n, guard) {\r\n      if (collection && typeof collection.length != 'number') {\r\n        collection = values(collection);\r\n      }\r\n      if (n == null || guard) {\r\n        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;\r\n      }\r\n      var result = shuffle(collection);\r\n      result.length = nativeMin(nativeMax(0, n), result.length);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of shuffled values, using a version of the Fisher-Yates\r\n     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to shuffle.\r\n     * @returns {Array} Returns a new shuffled collection.\r\n     * @example\r\n     *\r\n     * _.shuffle([1, 2, 3, 4, 5, 6]);\r\n     * // => [4, 1, 6, 3, 5, 2]\r\n     */\r\n    function shuffle(collection) {\r\n      var index = -1,\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      forEach(collection, function(value) {\r\n        var rand = baseRandom(0, ++index);\r\n        result[index] = result[rand];\r\n        result[rand] = value;\r\n      });\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the size of the `collection` by returning `collection.length` for arrays\r\n     * and array-like objects or the number of own enumerable properties for objects.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to inspect.\r\n     * @returns {number} Returns `collection.length` or number of own enumerable properties.\r\n     * @example\r\n     *\r\n     * _.size([1, 2]);\r\n     * // => 2\r\n     *\r\n     * _.size({ 'one': 1, 'two': 2, 'three': 3 });\r\n     * // => 3\r\n     *\r\n     * _.size('pebbles');\r\n     * // => 7\r\n     */\r\n    function size(collection) {\r\n      var length = collection ? collection.length : 0;\r\n      return typeof length == 'number' ? length : keys(collection).length;\r\n    }\r\n\r\n    /**\r\n     * Checks if the callback returns a truey value for **any** element of a\r\n     * collection. The function returns as soon as it finds a passing value and\r\n     * does not iterate over the entire collection. The callback is bound to\r\n     * `thisArg` and invoked with three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias any\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {boolean} Returns `true` if any element passed the callback check,\r\n     *  else `false`.\r\n     * @example\r\n     *\r\n     * _.some([null, 0, 'yes', false], Boolean);\r\n     * // => true\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',   'age': 40, 'blocked': true }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.some(characters, 'blocked');\r\n     * // => true\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.some(characters, { 'age': 1 });\r\n     * // => false\r\n     */\r\n    function some(collection, callback, thisArg) {\r\n      var result;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n\r\n      var index = -1,\r\n          length = collection ? collection.length : 0;\r\n\r\n      if (typeof length == 'number') {\r\n        while (++index < length) {\r\n          if ((result = callback(collection[index], index, collection))) {\r\n            break;\r\n          }\r\n        }\r\n      } else {\r\n        forOwn(collection, function(value, index, collection) {\r\n          return !(result = callback(value, index, collection));\r\n        });\r\n      }\r\n      return !!result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of elements, sorted in ascending order by the results of\r\n     * running each element in a collection through the callback. This method\r\n     * performs a stable sort, that is, it will preserve the original sort order\r\n     * of equal elements. The callback is bound to `thisArg` and invoked with\r\n     * three arguments; (value, index|key, collection).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an array of property names is provided for `callback` the collection\r\n     * will be sorted by each property value.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Array|Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of sorted elements.\r\n     * @example\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });\r\n     * // => [3, 1, 2]\r\n     *\r\n     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);\r\n     * // => [3, 1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'barney',  'age': 26 },\r\n     *   { 'name': 'fred',    'age': 30 }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.map(_.sortBy(characters, 'age'), _.values);\r\n     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]\r\n     *\r\n     * // sorting by multiple properties\r\n     * _.map(_.sortBy(characters, ['name', 'age']), _.values);\r\n     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]\r\n     */\r\n    function sortBy(collection, callback, thisArg) {\r\n      var index = -1,\r\n          isArr = isArray(callback),\r\n          length = collection ? collection.length : 0,\r\n          result = Array(typeof length == 'number' ? length : 0);\r\n\r\n      if (!isArr) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      forEach(collection, function(value, key, collection) {\r\n        var object = result[++index] = getObject();\r\n        if (isArr) {\r\n          object.criteria = map(callback, function(key) { return value[key]; });\r\n        } else {\r\n          (object.criteria = getArray())[0] = callback(value, key, collection);\r\n        }\r\n        object.index = index;\r\n        object.value = value;\r\n      });\r\n\r\n      length = result.length;\r\n      result.sort(compareAscending);\r\n      while (length--) {\r\n        var object = result[length];\r\n        result[length] = object.value;\r\n        if (!isArr) {\r\n          releaseArray(object.criteria);\r\n        }\r\n        releaseObject(object);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Converts the `collection` to an array.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to convert.\r\n     * @returns {Array} Returns the new converted array.\r\n     * @example\r\n     *\r\n     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function toArray(collection) {\r\n      if (collection && typeof collection.length == 'number') {\r\n        return slice(collection);\r\n      }\r\n      return values(collection);\r\n    }\r\n\r\n    /**\r\n     * Performs a deep comparison of each element in a `collection` to the given\r\n     * `properties` object, returning an array of all elements that have equivalent\r\n     * property values.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type Function\r\n     * @category Collections\r\n     * @param {Array|Object|string} collection The collection to iterate over.\r\n     * @param {Object} props The object of property values to filter by.\r\n     * @returns {Array} Returns a new array of elements that have the given properties.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * _.where(characters, { 'age': 36 });\r\n     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]\r\n     *\r\n     * _.where(characters, { 'pets': ['dino'] });\r\n     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]\r\n     */\r\n    var where = filter;\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates an array with all falsey values removed. The values `false`, `null`,\r\n     * `0`, `\"\"`, `undefined`, and `NaN` are all falsey.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to compact.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.compact([0, 1, false, 2, '', 3]);\r\n     * // => [1, 2, 3]\r\n     */\r\n    function compact(array) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (value) {\r\n          result.push(value);\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all values of the provided arrays using strict\r\n     * equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {...Array} [values] The arrays of values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);\r\n     * // => [1, 3, 4]\r\n     */\r\n    function difference(array) {\r\n      return baseDifference(array, baseFlatten(arguments, true, true, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.find` except that it returns the index of the first\r\n     * element that passes the callback check, instead of the element itself.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': false },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': true },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }\r\n     * ];\r\n     *\r\n     * _.findIndex(characters, function(chr) {\r\n     *   return chr.age < 20;\r\n     * });\r\n     * // => 2\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findIndex(characters, 'blocked');\r\n     * // => 1\r\n     */\r\n    function findIndex(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0;\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        if (callback(array[index], index, array)) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.findIndex` except that it iterates over elements\r\n     * of a `collection` from right to left.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index of the found element, else `-1`.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36, 'blocked': true },\r\n     *   { 'name': 'fred',    'age': 40, 'blocked': false },\r\n     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }\r\n     * ];\r\n     *\r\n     * _.findLastIndex(characters, function(chr) {\r\n     *   return chr.age > 30;\r\n     * });\r\n     * // => 1\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.findLastIndex(characters, { 'age': 36 });\r\n     * // => 0\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.findLastIndex(characters, 'blocked');\r\n     * // => 2\r\n     */\r\n    function findLastIndex(array, callback, thisArg) {\r\n      var length = array ? array.length : 0;\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (length--) {\r\n        if (callback(array[length], length, array)) {\r\n          return length;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Gets the first element or first `n` elements of an array. If a callback\r\n     * is provided elements at the beginning of the array are returned as long\r\n     * as the callback returns truey. The callback is bound to `thisArg` and\r\n     * invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias head, take\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the first element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.first([1, 2, 3]);\r\n     * // => 1\r\n     *\r\n     * _.first([1, 2, 3], 2);\r\n     * // => [1, 2]\r\n     *\r\n     * _.first([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [1, 2]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.first(characters, 'blocked');\r\n     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function first(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = -1;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[0] : undefined;\r\n        }\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, n), length));\r\n    }\r\n\r\n    /**\r\n     * Flattens a nested array (the nesting can be to any depth). If `isShallow`\r\n     * is truey, the array will only be flattened a single level. If a callback\r\n     * is provided each element of the array is passed through the callback before\r\n     * flattening. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to flatten.\r\n     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new flattened array.\r\n     * @example\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]]);\r\n     * // => [1, 2, 3, 4];\r\n     *\r\n     * _.flatten([1, [2], [3, [[4]]]], true);\r\n     * // => [1, 2, 3, [[4]]];\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },\r\n     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.flatten(characters, 'pets');\r\n     * // => ['hoppy', 'baby puss', 'dino']\r\n     */\r\n    function flatten(array, isShallow, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isShallow != 'boolean' && isShallow != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;\r\n        isShallow = false;\r\n      }\r\n      if (callback != null) {\r\n        array = map(array, callback, thisArg);\r\n      }\r\n      return baseFlatten(array, isShallow);\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the first occurrence of `value` is found using\r\n     * strict equality for comparisons, i.e. `===`. If the array is already sorted\r\n     * providing `true` for `fromIndex` will run a faster binary search.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\r\n     *  to perform a binary search on a sorted array.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 1\r\n     *\r\n     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 4\r\n     *\r\n     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);\r\n     * // => 2\r\n     */\r\n    function indexOf(array, value, fromIndex) {\r\n      if (typeof fromIndex == 'number') {\r\n        var length = array ? array.length : 0;\r\n        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);\r\n      } else if (fromIndex) {\r\n        var index = sortedIndex(array, value);\r\n        return array[index] === value ? index : -1;\r\n      }\r\n      return baseIndexOf(array, value, fromIndex);\r\n    }\r\n\r\n    /**\r\n     * Gets all but the last element or last `n` elements of an array. If a\r\n     * callback is provided elements at the end of the array are excluded from\r\n     * the result as long as the callback returns truey. The callback is bound\r\n     * to `thisArg` and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.initial([1, 2, 3]);\r\n     * // => [1, 2]\r\n     *\r\n     * _.initial([1, 2, 3], 2);\r\n     * // => [1]\r\n     *\r\n     * _.initial([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [1]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.initial(characters, 'blocked');\r\n     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');\r\n     * // => ['barney', 'fred']\r\n     */\r\n    function initial(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : callback || n;\r\n      }\r\n      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values present in all provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of shared values.\r\n     * @example\r\n     *\r\n     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2]\r\n     */\r\n    function intersection() {\r\n      var args = [],\r\n          argsIndex = -1,\r\n          argsLength = arguments.length,\r\n          caches = getArray(),\r\n          indexOf = getIndexOf(),\r\n          trustIndexOf = indexOf === baseIndexOf,\r\n          seen = getArray();\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var value = arguments[argsIndex];\r\n        if (isArray(value) || isArguments(value)) {\r\n          args.push(value);\r\n          caches.push(trustIndexOf && value.length >= largeArraySize &&\r\n            createCache(argsIndex ? args[argsIndex] : seen));\r\n        }\r\n      }\r\n      var array = args[0],\r\n          index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      outer:\r\n      while (++index < length) {\r\n        var cache = caches[0];\r\n        value = array[index];\r\n\r\n        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {\r\n          argsIndex = argsLength;\r\n          (cache || seen).push(value);\r\n          while (--argsIndex) {\r\n            cache = caches[argsIndex];\r\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {\r\n              continue outer;\r\n            }\r\n          }\r\n          result.push(value);\r\n        }\r\n      }\r\n      while (argsLength--) {\r\n        cache = caches[argsLength];\r\n        if (cache) {\r\n          releaseObject(cache);\r\n        }\r\n      }\r\n      releaseArray(caches);\r\n      releaseArray(seen);\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Gets the last element or last `n` elements of an array. If a callback is\r\n     * provided elements at the end of the array are returned as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback] The function called\r\n     *  per element or the number of elements to return. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {*} Returns the last element(s) of `array`.\r\n     * @example\r\n     *\r\n     * _.last([1, 2, 3]);\r\n     * // => 3\r\n     *\r\n     * _.last([1, 2, 3], 2);\r\n     * // => [2, 3]\r\n     *\r\n     * _.last([1, 2, 3], function(num) {\r\n     *   return num > 1;\r\n     * });\r\n     * // => [2, 3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.last(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.last(characters, { 'employer': 'na' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function last(array, callback, thisArg) {\r\n      var n = 0,\r\n          length = array ? array.length : 0;\r\n\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var index = length;\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (index-- && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = callback;\r\n        if (n == null || thisArg) {\r\n          return array ? array[length - 1] : undefined;\r\n        }\r\n      }\r\n      return slice(array, nativeMax(0, length - n));\r\n    }\r\n\r\n    /**\r\n     * Gets the index at which the last occurrence of `value` is found using strict\r\n     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used\r\n     * as the offset from the end of the collection.\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to search.\r\n     * @param {*} value The value to search for.\r\n     * @param {number} [fromIndex=array.length-1] The index to search from.\r\n     * @returns {number} Returns the index of the matched value or `-1`.\r\n     * @example\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);\r\n     * // => 4\r\n     *\r\n     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);\r\n     * // => 1\r\n     */\r\n    function lastIndexOf(array, value, fromIndex) {\r\n      var index = array ? array.length : 0;\r\n      if (typeof fromIndex == 'number') {\r\n        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;\r\n      }\r\n      while (index--) {\r\n        if (array[index] === value) {\r\n          return index;\r\n        }\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    /**\r\n     * Removes all provided values from the given array using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {...*} [value] The values to remove.\r\n     * @returns {Array} Returns `array`.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 1, 2, 3];\r\n     * _.pull(array, 2, 3);\r\n     * console.log(array);\r\n     * // => [1, 1]\r\n     */\r\n    function pull(array) {\r\n      var args = arguments,\r\n          argsIndex = 0,\r\n          argsLength = args.length,\r\n          length = array ? array.length : 0;\r\n\r\n      while (++argsIndex < argsLength) {\r\n        var index = -1,\r\n            value = args[argsIndex];\r\n        while (++index < length) {\r\n          if (array[index] === value) {\r\n            splice.call(array, index--, 1);\r\n            length--;\r\n          }\r\n        }\r\n      }\r\n      return array;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of numbers (positive and/or negative) progressing from\r\n     * `start` up to but not including `end`. If `start` is less than `stop` a\r\n     * zero-length range is created unless a negative `step` is specified.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {number} [start=0] The start of the range.\r\n     * @param {number} end The end of the range.\r\n     * @param {number} [step=1] The value to increment or decrement by.\r\n     * @returns {Array} Returns a new range array.\r\n     * @example\r\n     *\r\n     * _.range(4);\r\n     * // => [0, 1, 2, 3]\r\n     *\r\n     * _.range(1, 5);\r\n     * // => [1, 2, 3, 4]\r\n     *\r\n     * _.range(0, 20, 5);\r\n     * // => [0, 5, 10, 15]\r\n     *\r\n     * _.range(0, -4, -1);\r\n     * // => [0, -1, -2, -3]\r\n     *\r\n     * _.range(1, 4, 0);\r\n     * // => [1, 1, 1]\r\n     *\r\n     * _.range(0);\r\n     * // => []\r\n     */\r\n    function range(start, end, step) {\r\n      start = +start || 0;\r\n      step = typeof step == 'number' ? step : (+step || 1);\r\n\r\n      if (end == null) {\r\n        end = start;\r\n        start = 0;\r\n      }\r\n      // use `Array(length)` so engines like Chakra and V8 avoid slower modes\r\n      // http://youtu.be/XAqIpGU8ZZk#t=17m25s\r\n      var index = -1,\r\n          length = nativeMax(0, ceil((end - start) / (step || 1))),\r\n          result = Array(length);\r\n\r\n      while (++index < length) {\r\n        result[index] = start;\r\n        start += step;\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Removes all elements from an array that the callback returns truey for\r\n     * and returns an array of removed elements. The callback is bound to `thisArg`\r\n     * and invoked with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to modify.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a new array of removed elements.\r\n     * @example\r\n     *\r\n     * var array = [1, 2, 3, 4, 5, 6];\r\n     * var evens = _.remove(array, function(num) { return num % 2 == 0; });\r\n     *\r\n     * console.log(array);\r\n     * // => [1, 3, 5]\r\n     *\r\n     * console.log(evens);\r\n     * // => [2, 4, 6]\r\n     */\r\n    function remove(array, callback, thisArg) {\r\n      var index = -1,\r\n          length = array ? array.length : 0,\r\n          result = [];\r\n\r\n      callback = lodash.createCallback(callback, thisArg, 3);\r\n      while (++index < length) {\r\n        var value = array[index];\r\n        if (callback(value, index, array)) {\r\n          result.push(value);\r\n          splice.call(array, index--, 1);\r\n          length--;\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The opposite of `_.initial` this method gets all but the first element or\r\n     * first `n` elements of an array. If a callback function is provided elements\r\n     * at the beginning of the array are excluded from the result as long as the\r\n     * callback returns truey. The callback is bound to `thisArg` and invoked\r\n     * with three arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias drop, tail\r\n     * @category Arrays\r\n     * @param {Array} array The array to query.\r\n     * @param {Function|Object|number|string} [callback=1] The function called\r\n     *  per element or the number of elements to exclude. If a property name or\r\n     *  object is provided it will be used to create a \"_.pluck\" or \"_.where\"\r\n     *  style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a slice of `array`.\r\n     * @example\r\n     *\r\n     * _.rest([1, 2, 3]);\r\n     * // => [2, 3]\r\n     *\r\n     * _.rest([1, 2, 3], 2);\r\n     * // => [3]\r\n     *\r\n     * _.rest([1, 2, 3], function(num) {\r\n     *   return num < 3;\r\n     * });\r\n     * // => [3]\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },\r\n     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },\r\n     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }\r\n     * ];\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.pluck(_.rest(characters, 'blocked'), 'name');\r\n     * // => ['fred', 'pebbles']\r\n     *\r\n     * // using \"_.where\" callback shorthand\r\n     * _.rest(characters, { 'employer': 'slate' });\r\n     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]\r\n     */\r\n    function rest(array, callback, thisArg) {\r\n      if (typeof callback != 'number' && callback != null) {\r\n        var n = 0,\r\n            index = -1,\r\n            length = array ? array.length : 0;\r\n\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n        while (++index < length && callback(array[index], index, array)) {\r\n          n++;\r\n        }\r\n      } else {\r\n        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);\r\n      }\r\n      return slice(array, n);\r\n    }\r\n\r\n    /**\r\n     * Uses a binary search to determine the smallest index at which a value\r\n     * should be inserted into a given sorted array in order to maintain the sort\r\n     * order of the array. If a callback is provided it will be executed for\r\n     * `value` and each element of `array` to compute their sort ranking. The\r\n     * callback is bound to `thisArg` and invoked with one argument; (value).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to inspect.\r\n     * @param {*} value The value to evaluate.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {number} Returns the index at which `value` should be inserted\r\n     *  into `array`.\r\n     * @example\r\n     *\r\n     * _.sortedIndex([20, 30, 50], 40);\r\n     * // => 2\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\r\n     * // => 2\r\n     *\r\n     * var dict = {\r\n     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }\r\n     * };\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return dict.wordToNumber[word];\r\n     * });\r\n     * // => 2\r\n     *\r\n     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {\r\n     *   return this.wordToNumber[word];\r\n     * }, dict);\r\n     * // => 2\r\n     */\r\n    function sortedIndex(array, value, callback, thisArg) {\r\n      var low = 0,\r\n          high = array ? array.length : low;\r\n\r\n      // explicitly reference `identity` for better inlining in Firefox\r\n      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;\r\n      value = callback(value);\r\n\r\n      while (low < high) {\r\n        var mid = (low + high) >>> 1;\r\n        (callback(array[mid]) < value)\r\n          ? low = mid + 1\r\n          : high = mid;\r\n      }\r\n      return low;\r\n    }\r\n\r\n    /**\r\n     * Creates an array of unique values, in order, of the provided arrays using\r\n     * strict equality for comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of combined values.\r\n     * @example\r\n     *\r\n     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);\r\n     * // => [1, 2, 3, 5, 4]\r\n     */\r\n    function union() {\r\n      return baseUniq(baseFlatten(arguments, true, true));\r\n    }\r\n\r\n    /**\r\n     * Creates a duplicate-value-free version of an array using strict equality\r\n     * for comparisons, i.e. `===`. If the array is sorted, providing\r\n     * `true` for `isSorted` will use a faster algorithm. If a callback is provided\r\n     * each element of `array` is passed through the callback before uniqueness\r\n     * is computed. The callback is bound to `thisArg` and invoked with three\r\n     * arguments; (value, index, array).\r\n     *\r\n     * If a property name is provided for `callback` the created \"_.pluck\" style\r\n     * callback will return the property value of the given element.\r\n     *\r\n     * If an object is provided for `callback` the created \"_.where\" style callback\r\n     * will return `true` for elements that have the properties of the given object,\r\n     * else `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unique\r\n     * @category Arrays\r\n     * @param {Array} array The array to process.\r\n     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.\r\n     * @param {Function|Object|string} [callback=identity] The function called\r\n     *  per iteration. If a property name or object is provided it will be used\r\n     *  to create a \"_.pluck\" or \"_.where\" style callback, respectively.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns a duplicate-value-free array.\r\n     * @example\r\n     *\r\n     * _.uniq([1, 2, 1, 3, 1]);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq([1, 1, 2, 2, 3], true);\r\n     * // => [1, 2, 3]\r\n     *\r\n     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });\r\n     * // => ['A', 'b', 'C']\r\n     *\r\n     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);\r\n     * // => [1, 2.5, 3]\r\n     *\r\n     * // using \"_.pluck\" callback shorthand\r\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\r\n     * // => [{ 'x': 1 }, { 'x': 2 }]\r\n     */\r\n    function uniq(array, isSorted, callback, thisArg) {\r\n      // juggle arguments\r\n      if (typeof isSorted != 'boolean' && isSorted != null) {\r\n        thisArg = callback;\r\n        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;\r\n        isSorted = false;\r\n      }\r\n      if (callback != null) {\r\n        callback = lodash.createCallback(callback, thisArg, 3);\r\n      }\r\n      return baseUniq(array, isSorted, callback);\r\n    }\r\n\r\n    /**\r\n     * Creates an array excluding all provided values using strict equality for\r\n     * comparisons, i.e. `===`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {Array} array The array to filter.\r\n     * @param {...*} [value] The values to exclude.\r\n     * @returns {Array} Returns a new array of filtered values.\r\n     * @example\r\n     *\r\n     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);\r\n     * // => [2, 3, 4]\r\n     */\r\n    function without(array) {\r\n      return baseDifference(array, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates an array that is the symmetric difference of the provided arrays.\r\n     * See http://en.wikipedia.org/wiki/Symmetric_difference.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Arrays\r\n     * @param {...Array} [array] The arrays to inspect.\r\n     * @returns {Array} Returns an array of values.\r\n     * @example\r\n     *\r\n     * _.xor([1, 2, 3], [5, 2, 1, 4]);\r\n     * // => [3, 5, 4]\r\n     *\r\n     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);\r\n     * // => [1, 4, 5]\r\n     */\r\n    function xor() {\r\n      var index = -1,\r\n          length = arguments.length;\r\n\r\n      while (++index < length) {\r\n        var array = arguments[index];\r\n        if (isArray(array) || isArguments(array)) {\r\n          var result = result\r\n            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))\r\n            : array;\r\n        }\r\n      }\r\n      return result || [];\r\n    }\r\n\r\n    /**\r\n     * Creates an array of grouped elements, the first of which contains the first\r\n     * elements of the given arrays, the second of which contains the second\r\n     * elements of the given arrays, and so on.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias unzip\r\n     * @category Arrays\r\n     * @param {...Array} [array] Arrays to process.\r\n     * @returns {Array} Returns a new array of grouped elements.\r\n     * @example\r\n     *\r\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\r\n     * // => [['fred', 30, true], ['barney', 40, false]]\r\n     */\r\n    function zip() {\r\n      var array = arguments.length > 1 ? arguments : arguments[0],\r\n          index = -1,\r\n          length = array ? max(pluck(array, 'length')) : 0,\r\n          result = Array(length < 0 ? 0 : length);\r\n\r\n      while (++index < length) {\r\n        result[index] = pluck(array, index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Creates an object composed from arrays of `keys` and `values`. Provide\r\n     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`\r\n     * or two arrays, one of `keys` and one of corresponding `values`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @alias object\r\n     * @category Arrays\r\n     * @param {Array} keys The array of keys.\r\n     * @param {Array} [values=[]] The array of values.\r\n     * @returns {Object} Returns an object composed of the given keys and\r\n     *  corresponding values.\r\n     * @example\r\n     *\r\n     * _.zipObject(['fred', 'barney'], [30, 40]);\r\n     * // => { 'fred': 30, 'barney': 40 }\r\n     */\r\n    function zipObject(keys, values) {\r\n      var index = -1,\r\n          length = keys ? keys.length : 0,\r\n          result = {};\r\n\r\n      if (!values && length && !isArray(keys[0])) {\r\n        values = [];\r\n      }\r\n      while (++index < length) {\r\n        var key = keys[index];\r\n        if (values) {\r\n          result[key] = values[index];\r\n        } else if (key) {\r\n          result[key[0]] = key[1];\r\n        }\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that executes `func`, with  the `this` binding and\r\n     * arguments of the created function, only after being called `n` times.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {number} n The number of times the function must be called before\r\n     *  `func` is executed.\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var saves = ['profile', 'settings'];\r\n     *\r\n     * var done = _.after(saves.length, function() {\r\n     *   console.log('Done saving!');\r\n     * });\r\n     *\r\n     * _.forEach(saves, function(type) {\r\n     *   asyncSave({ 'type': type, 'complete': done });\r\n     * });\r\n     * // => logs 'Done saving!', after all saves have completed\r\n     */\r\n    function after(n, func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (--n < 1) {\r\n          return func.apply(this, arguments);\r\n        }\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with the `this`\r\n     * binding of `thisArg` and prepends any additional `bind` arguments to those\r\n     * provided to the bound function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to bind.\r\n     * @param {*} [thisArg] The `this` binding of `func`.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var func = function(greeting) {\r\n     *   return greeting + ' ' + this.name;\r\n     * };\r\n     *\r\n     * func = _.bind(func, { 'name': 'fred' }, 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     */\r\n    function bind(func, thisArg) {\r\n      return arguments.length > 2\r\n        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)\r\n        : createWrapper(func, 1, null, null, thisArg);\r\n    }\r\n\r\n    /**\r\n     * Binds methods of an object to the object itself, overwriting the existing\r\n     * method. Method names may be specified as individual arguments or as arrays\r\n     * of method names. If no method names are provided all the function properties\r\n     * of `object` will be bound.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object to bind and assign the bound methods to.\r\n     * @param {...string} [methodName] The object method names to\r\n     *  bind, specified as individual method names or arrays of method names.\r\n     * @returns {Object} Returns `object`.\r\n     * @example\r\n     *\r\n     * var view = {\r\n     *   'label': 'docs',\r\n     *   'onClick': function() { console.log('clicked ' + this.label); }\r\n     * };\r\n     *\r\n     * _.bindAll(view);\r\n     * jQuery('#docs').on('click', view.onClick);\r\n     * // => logs 'clicked docs', when the button is clicked\r\n     */\r\n    function bindAll(object) {\r\n      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),\r\n          index = -1,\r\n          length = funcs.length;\r\n\r\n      while (++index < length) {\r\n        var key = funcs[index];\r\n        object[key] = createWrapper(object[key], 1, null, null, object);\r\n      }\r\n      return object;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes the method at `object[key]`\r\n     * and prepends any additional `bindKey` arguments to those provided to the bound\r\n     * function. This method differs from `_.bind` by allowing bound functions to\r\n     * reference methods that will be redefined or don't yet exist.\r\n     * See http://michaux.ca/articles/lazy-function-definition-pattern.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Object} object The object the method belongs to.\r\n     * @param {string} key The key of the method.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new bound function.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'name': 'fred',\r\n     *   'greet': function(greeting) {\r\n     *     return greeting + ' ' + this.name;\r\n     *   }\r\n     * };\r\n     *\r\n     * var func = _.bindKey(object, 'greet', 'hi');\r\n     * func();\r\n     * // => 'hi fred'\r\n     *\r\n     * object.greet = function(greeting) {\r\n     *   return greeting + 'ya ' + this.name + '!';\r\n     * };\r\n     *\r\n     * func();\r\n     * // => 'hiya fred!'\r\n     */\r\n    function bindKey(object, key) {\r\n      return arguments.length > 2\r\n        ? createWrapper(key, 19, slice(arguments, 2), null, object)\r\n        : createWrapper(key, 3, null, null, object);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is the composition of the provided functions,\r\n     * where each function consumes the return value of the function that follows.\r\n     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.\r\n     * Each function is executed with the `this` binding of the composed function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {...Function} [func] Functions to compose.\r\n     * @returns {Function} Returns the new composed function.\r\n     * @example\r\n     *\r\n     * var realNameMap = {\r\n     *   'pebbles': 'penelope'\r\n     * };\r\n     *\r\n     * var format = function(name) {\r\n     *   name = realNameMap[name.toLowerCase()] || name;\r\n     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();\r\n     * };\r\n     *\r\n     * var greet = function(formatted) {\r\n     *   return 'Hiya ' + formatted + '!';\r\n     * };\r\n     *\r\n     * var welcome = _.compose(greet, format);\r\n     * welcome('pebbles');\r\n     * // => 'Hiya Penelope!'\r\n     */\r\n    function compose() {\r\n      var funcs = arguments,\r\n          length = funcs.length;\r\n\r\n      while (length--) {\r\n        if (!isFunction(funcs[length])) {\r\n          throw new TypeError;\r\n        }\r\n      }\r\n      return function() {\r\n        var args = arguments,\r\n            length = funcs.length;\r\n\r\n        while (length--) {\r\n          args = [funcs[length].apply(this, args)];\r\n        }\r\n        return args[0];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function which accepts one or more arguments of `func` that when\r\n     * invoked either executes `func` returning its result, if all `func` arguments\r\n     * have been provided, or returns a function that accepts one or more of the\r\n     * remaining `func` arguments, and so on. The arity of `func` can be specified\r\n     * if `func.length` is not sufficient.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to curry.\r\n     * @param {number} [arity=func.length] The arity of `func`.\r\n     * @returns {Function} Returns the new curried function.\r\n     * @example\r\n     *\r\n     * var curried = _.curry(function(a, b, c) {\r\n     *   console.log(a + b + c);\r\n     * });\r\n     *\r\n     * curried(1)(2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2)(3);\r\n     * // => 6\r\n     *\r\n     * curried(1, 2, 3);\r\n     * // => 6\r\n     */\r\n    function curry(func, arity) {\r\n      arity = typeof arity == 'number' ? arity : (+arity || func.length);\r\n      return createWrapper(func, 4, null, null, null, arity);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that will delay the execution of `func` until after\r\n     * `wait` milliseconds have elapsed since the last time it was invoked.\r\n     * Provide an options object to indicate that `func` should be invoked on\r\n     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls\r\n     * to the debounced function will return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the debounced function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to debounce.\r\n     * @param {number} wait The number of milliseconds to delay.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.\r\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new debounced function.\r\n     * @example\r\n     *\r\n     * // avoid costly calculations while the window size is in flux\r\n     * var lazyLayout = _.debounce(calculateLayout, 150);\r\n     * jQuery(window).on('resize', lazyLayout);\r\n     *\r\n     * // execute `sendMail` when the click event is fired, debouncing subsequent calls\r\n     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {\r\n     *   'leading': true,\r\n     *   'trailing': false\r\n     * });\r\n     *\r\n     * // ensure `batchLog` is executed once after 1 second of debounced calls\r\n     * var source = new EventSource('/stream');\r\n     * source.addEventListener('message', _.debounce(batchLog, 250, {\r\n     *   'maxWait': 1000\r\n     * }, false);\r\n     */\r\n    function debounce(func, wait, options) {\r\n      var args,\r\n          maxTimeoutId,\r\n          result,\r\n          stamp,\r\n          thisArg,\r\n          timeoutId,\r\n          trailingCall,\r\n          lastCalled = 0,\r\n          maxWait = false,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      wait = nativeMax(0, wait) || 0;\r\n      if (options === true) {\r\n        var leading = true;\r\n        trailing = false;\r\n      } else if (isObject(options)) {\r\n        leading = options.leading;\r\n        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      var delayed = function() {\r\n        var remaining = wait - (now() - stamp);\r\n        if (remaining <= 0) {\r\n          if (maxTimeoutId) {\r\n            clearTimeout(maxTimeoutId);\r\n          }\r\n          var isCalled = trailingCall;\r\n          maxTimeoutId = timeoutId = trailingCall = undefined;\r\n          if (isCalled) {\r\n            lastCalled = now();\r\n            result = func.apply(thisArg, args);\r\n            if (!timeoutId && !maxTimeoutId) {\r\n              args = thisArg = null;\r\n            }\r\n          }\r\n        } else {\r\n          timeoutId = setTimeout(delayed, remaining);\r\n        }\r\n      };\r\n\r\n      var maxDelayed = function() {\r\n        if (timeoutId) {\r\n          clearTimeout(timeoutId);\r\n        }\r\n        maxTimeoutId = timeoutId = trailingCall = undefined;\r\n        if (trailing || (maxWait !== wait)) {\r\n          lastCalled = now();\r\n          result = func.apply(thisArg, args);\r\n          if (!timeoutId && !maxTimeoutId) {\r\n            args = thisArg = null;\r\n          }\r\n        }\r\n      };\r\n\r\n      return function() {\r\n        args = arguments;\r\n        stamp = now();\r\n        thisArg = this;\r\n        trailingCall = trailing && (timeoutId || !leading);\r\n\r\n        if (maxWait === false) {\r\n          var leadingCall = leading && !timeoutId;\r\n        } else {\r\n          if (!maxTimeoutId && !leading) {\r\n            lastCalled = stamp;\r\n          }\r\n          var remaining = maxWait - (stamp - lastCalled),\r\n              isCalled = remaining <= 0;\r\n\r\n          if (isCalled) {\r\n            if (maxTimeoutId) {\r\n              maxTimeoutId = clearTimeout(maxTimeoutId);\r\n            }\r\n            lastCalled = stamp;\r\n            result = func.apply(thisArg, args);\r\n          }\r\n          else if (!maxTimeoutId) {\r\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\r\n          }\r\n        }\r\n        if (isCalled && timeoutId) {\r\n          timeoutId = clearTimeout(timeoutId);\r\n        }\r\n        else if (!timeoutId && wait !== maxWait) {\r\n          timeoutId = setTimeout(delayed, wait);\r\n        }\r\n        if (leadingCall) {\r\n          isCalled = true;\r\n          result = func.apply(thisArg, args);\r\n        }\r\n        if (isCalled && !timeoutId && !maxTimeoutId) {\r\n          args = thisArg = null;\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Defers executing the `func` function until the current call stack has cleared.\r\n     * Additional arguments will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to defer.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.defer(function(text) { console.log(text); }, 'deferred');\r\n     * // logs 'deferred' after one or more milliseconds\r\n     */\r\n    function defer(func) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 1);\r\n      return setTimeout(function() { func.apply(undefined, args); }, 1);\r\n    }\r\n\r\n    /**\r\n     * Executes the `func` function after `wait` milliseconds. Additional arguments\r\n     * will be provided to `func` when it is invoked.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to delay.\r\n     * @param {number} wait The number of milliseconds to delay execution.\r\n     * @param {...*} [arg] Arguments to invoke the function with.\r\n     * @returns {number} Returns the timer id.\r\n     * @example\r\n     *\r\n     * _.delay(function(text) { console.log(text); }, 1000, 'later');\r\n     * // => logs 'later' after one second\r\n     */\r\n    function delay(func, wait) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var args = slice(arguments, 2);\r\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that memoizes the result of `func`. If `resolver` is\r\n     * provided it will be used to determine the cache key for storing the result\r\n     * based on the arguments provided to the memoized function. By default, the\r\n     * first argument provided to the memoized function is used as the cache key.\r\n     * The `func` is executed with the `this` binding of the memoized function.\r\n     * The result cache is exposed as the `cache` property on the memoized function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to have its output memoized.\r\n     * @param {Function} [resolver] A function used to resolve the cache key.\r\n     * @returns {Function} Returns the new memoizing function.\r\n     * @example\r\n     *\r\n     * var fibonacci = _.memoize(function(n) {\r\n     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);\r\n     * });\r\n     *\r\n     * fibonacci(9)\r\n     * // => 34\r\n     *\r\n     * var data = {\r\n     *   'fred': { 'name': 'fred', 'age': 40 },\r\n     *   'pebbles': { 'name': 'pebbles', 'age': 1 }\r\n     * };\r\n     *\r\n     * // modifying the result cache\r\n     * var get = _.memoize(function(name) { return data[name]; }, _.identity);\r\n     * get('pebbles');\r\n     * // => { 'name': 'pebbles', 'age': 1 }\r\n     *\r\n     * get.cache.pebbles.name = 'penelope';\r\n     * get('pebbles');\r\n     * // => { 'name': 'penelope', 'age': 1 }\r\n     */\r\n    function memoize(func, resolver) {\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      var memoized = function() {\r\n        var cache = memoized.cache,\r\n            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];\r\n\r\n        return hasOwnProperty.call(cache, key)\r\n          ? cache[key]\r\n          : (cache[key] = func.apply(this, arguments));\r\n      }\r\n      memoized.cache = {};\r\n      return memoized;\r\n    }\r\n\r\n    /**\r\n     * Creates a function that is restricted to execute `func` once. Repeat calls to\r\n     * the function will return the value of the first call. The `func` is executed\r\n     * with the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to restrict.\r\n     * @returns {Function} Returns the new restricted function.\r\n     * @example\r\n     *\r\n     * var initialize = _.once(createApplication);\r\n     * initialize();\r\n     * initialize();\r\n     * // `initialize` executes `createApplication` once\r\n     */\r\n    function once(func) {\r\n      var ran,\r\n          result;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      return function() {\r\n        if (ran) {\r\n          return result;\r\n        }\r\n        ran = true;\r\n        result = func.apply(this, arguments);\r\n\r\n        // clear the `func` variable so the function may be garbage collected\r\n        func = null;\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when called, invokes `func` with any additional\r\n     * `partial` arguments prepended to those provided to the new function. This\r\n     * method is similar to `_.bind` except it does **not** alter the `this` binding.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var greet = function(greeting, name) { return greeting + ' ' + name; };\r\n     * var hi = _.partial(greet, 'hi');\r\n     * hi('fred');\r\n     * // => 'hi fred'\r\n     */\r\n    function partial(func) {\r\n      return createWrapper(func, 16, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * This method is like `_.partial` except that `partial` arguments are\r\n     * appended to those provided to the new function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to partially apply arguments to.\r\n     * @param {...*} [arg] Arguments to be partially applied.\r\n     * @returns {Function} Returns the new partially applied function.\r\n     * @example\r\n     *\r\n     * var defaultsDeep = _.partialRight(_.merge, _.defaults);\r\n     *\r\n     * var options = {\r\n     *   'variable': 'data',\r\n     *   'imports': { 'jq': $ }\r\n     * };\r\n     *\r\n     * defaultsDeep(options, _.templateSettings);\r\n     *\r\n     * options.variable\r\n     * // => 'data'\r\n     *\r\n     * options.imports\r\n     * // => { '_': _, 'jq': $ }\r\n     */\r\n    function partialRight(func) {\r\n      return createWrapper(func, 32, null, slice(arguments, 1));\r\n    }\r\n\r\n    /**\r\n     * Creates a function that, when executed, will only call the `func` function\r\n     * at most once per every `wait` milliseconds. Provide an options object to\r\n     * indicate that `func` should be invoked on the leading and/or trailing edge\r\n     * of the `wait` timeout. Subsequent calls to the throttled function will\r\n     * return the result of the last `func` call.\r\n     *\r\n     * Note: If `leading` and `trailing` options are `true` `func` will be called\r\n     * on the trailing edge of the timeout only if the the throttled function is\r\n     * invoked more than once during the `wait` timeout.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {Function} func The function to throttle.\r\n     * @param {number} wait The number of milliseconds to throttle executions to.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.\r\n     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.\r\n     * @returns {Function} Returns the new throttled function.\r\n     * @example\r\n     *\r\n     * // avoid excessively updating the position while scrolling\r\n     * var throttled = _.throttle(updatePosition, 100);\r\n     * jQuery(window).on('scroll', throttled);\r\n     *\r\n     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes\r\n     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\r\n     *   'trailing': false\r\n     * }));\r\n     */\r\n    function throttle(func, wait, options) {\r\n      var leading = true,\r\n          trailing = true;\r\n\r\n      if (!isFunction(func)) {\r\n        throw new TypeError;\r\n      }\r\n      if (options === false) {\r\n        leading = false;\r\n      } else if (isObject(options)) {\r\n        leading = 'leading' in options ? options.leading : leading;\r\n        trailing = 'trailing' in options ? options.trailing : trailing;\r\n      }\r\n      debounceOptions.leading = leading;\r\n      debounceOptions.maxWait = wait;\r\n      debounceOptions.trailing = trailing;\r\n\r\n      return debounce(func, wait, debounceOptions);\r\n    }\r\n\r\n    /**\r\n     * Creates a function that provides `value` to the wrapper function as its\r\n     * first argument. Additional arguments provided to the function are appended\r\n     * to those provided to the wrapper function. The wrapper is executed with\r\n     * the `this` binding of the created function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Functions\r\n     * @param {*} value The value to wrap.\r\n     * @param {Function} wrapper The wrapper function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var p = _.wrap(_.escape, function(func, text) {\r\n     *   return '<p>' + func(text) + '</p>';\r\n     * });\r\n     *\r\n     * p('Fred, Wilma, & Pebbles');\r\n     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'\r\n     */\r\n    function wrap(value, wrapper) {\r\n      return createWrapper(wrapper, 16, [value]);\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a function that returns `value`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value The value to return from the new function.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * var getter = _.constant(object);\r\n     * getter() === object;\r\n     * // => true\r\n     */\r\n    function constant(value) {\r\n      return function() {\r\n        return value;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a callback bound to an optional `thisArg`. If `func` is a property\r\n     * name the created callback will return the property value for a given element.\r\n     * If `func` is an object the created callback will return `true` for elements\r\n     * that contain the equivalent object properties, otherwise it will return `false`.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} [func=identity] The value to convert to a callback.\r\n     * @param {*} [thisArg] The `this` binding of the created callback.\r\n     * @param {number} [argCount] The number of arguments the callback accepts.\r\n     * @returns {Function} Returns a callback function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // wrap to create custom callback shorthands\r\n     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {\r\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);\r\n     *   return !match ? func(callback, thisArg) : function(object) {\r\n     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];\r\n     *   };\r\n     * });\r\n     *\r\n     * _.filter(characters, 'age__gt38');\r\n     * // => [{ 'name': 'fred', 'age': 40 }]\r\n     */\r\n    function createCallback(func, thisArg, argCount) {\r\n      var type = typeof func;\r\n      if (func == null || type == 'function') {\r\n        return baseCreateCallback(func, thisArg, argCount);\r\n      }\r\n      // handle \"_.pluck\" style callback shorthands\r\n      if (type != 'object') {\r\n        return property(func);\r\n      }\r\n      var props = keys(func),\r\n          key = props[0],\r\n          a = func[key];\r\n\r\n      // handle \"_.where\" style callback shorthands\r\n      if (props.length == 1 && a === a && !isObject(a)) {\r\n        // fast path the common case of providing an object with a single\r\n        // property containing a primitive value\r\n        return function(object) {\r\n          var b = object[key];\r\n          return a === b && (a !== 0 || (1 / a == 1 / b));\r\n        };\r\n      }\r\n      return function(object) {\r\n        var length = props.length,\r\n            result = false;\r\n\r\n        while (length--) {\r\n          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {\r\n            break;\r\n          }\r\n        }\r\n        return result;\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Converts the characters `&`, `<`, `>`, `\"`, and `'` in `string` to their\r\n     * corresponding HTML entities.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to escape.\r\n     * @returns {string} Returns the escaped string.\r\n     * @example\r\n     *\r\n     * _.escape('Fred, Wilma, & Pebbles');\r\n     * // => 'Fred, Wilma, &amp; Pebbles'\r\n     */\r\n    function escape(string) {\r\n      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * This method returns the first argument provided to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {*} value Any value.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.identity(object) === object;\r\n     * // => true\r\n     */\r\n    function identity(value) {\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Adds function properties of a source object to the destination object.\r\n     * If `object` is a function methods will be added to its prototype as well.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Function|Object} [object=lodash] object The destination object.\r\n     * @param {Object} source The object of functions to add.\r\n     * @param {Object} [options] The options object.\r\n     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.\r\n     * @example\r\n     *\r\n     * function capitalize(string) {\r\n     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();\r\n     * }\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize });\r\n     * _.capitalize('fred');\r\n     * // => 'Fred'\r\n     *\r\n     * _('fred').capitalize().value();\r\n     * // => 'Fred'\r\n     *\r\n     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });\r\n     * _('fred').capitalize();\r\n     * // => 'Fred'\r\n     */\r\n    function mixin(object, source, options) {\r\n      var chain = true,\r\n          methodNames = source && functions(source);\r\n\r\n      if (!source || (!options && !methodNames.length)) {\r\n        if (options == null) {\r\n          options = source;\r\n        }\r\n        ctor = lodashWrapper;\r\n        source = object;\r\n        object = lodash;\r\n        methodNames = functions(source);\r\n      }\r\n      if (options === false) {\r\n        chain = false;\r\n      } else if (isObject(options) && 'chain' in options) {\r\n        chain = options.chain;\r\n      }\r\n      var ctor = object,\r\n          isFunc = isFunction(ctor);\r\n\r\n      forEach(methodNames, function(methodName) {\r\n        var func = object[methodName] = source[methodName];\r\n        if (isFunc) {\r\n          ctor.prototype[methodName] = function() {\r\n            var chainAll = this.__chain__,\r\n                value = this.__wrapped__,\r\n                args = [value];\r\n\r\n            push.apply(args, arguments);\r\n            var result = func.apply(object, args);\r\n            if (chain || chainAll) {\r\n              if (value === result && isObject(result)) {\r\n                return this;\r\n              }\r\n              result = new ctor(result);\r\n              result.__chain__ = chainAll;\r\n            }\r\n            return result;\r\n          };\r\n        }\r\n      });\r\n    }\r\n\r\n    /**\r\n     * Reverts the '_' variable to its previous value and returns a reference to\r\n     * the `lodash` function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @returns {Function} Returns the `lodash` function.\r\n     * @example\r\n     *\r\n     * var lodash = _.noConflict();\r\n     */\r\n    function noConflict() {\r\n      context._ = oldDash;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * A no-operation function.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var object = { 'name': 'fred' };\r\n     * _.noop(object) === undefined;\r\n     * // => true\r\n     */\r\n    function noop() {\r\n      // no operation performed\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\r\n     * (1 January 1970 00:00:00 UTC).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @example\r\n     *\r\n     * var stamp = _.now();\r\n     * _.defer(function() { console.log(_.now() - stamp); });\r\n     * // => logs the number of milliseconds it took for the deferred function to be called\r\n     */\r\n    var now = isNative(now = Date.now) && now || function() {\r\n      return new Date().getTime();\r\n    };\r\n\r\n    /**\r\n     * Converts the given value into an integer of the specified radix.\r\n     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the\r\n     * `value` is a hexadecimal, in which case a `radix` of `16` is used.\r\n     *\r\n     * Note: This method avoids differences in native ES3 and ES5 `parseInt`\r\n     * implementations. See http://es5.github.io/#E.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} value The value to parse.\r\n     * @param {number} [radix] The radix used to interpret the value to parse.\r\n     * @returns {number} Returns the new integer value.\r\n     * @example\r\n     *\r\n     * _.parseInt('08');\r\n     * // => 8\r\n     */\r\n    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {\r\n      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`\r\n      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);\r\n    };\r\n\r\n    /**\r\n     * Creates a \"_.pluck\" style function, which returns the `key` value of a\r\n     * given object.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} key The name of the property to retrieve.\r\n     * @returns {Function} Returns the new function.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'fred',   'age': 40 },\r\n     *   { 'name': 'barney', 'age': 36 }\r\n     * ];\r\n     *\r\n     * var getName = _.property('name');\r\n     *\r\n     * _.map(characters, getName);\r\n     * // => ['barney', 'fred']\r\n     *\r\n     * _.sortBy(characters, getName);\r\n     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]\r\n     */\r\n    function property(key) {\r\n      return function(object) {\r\n        return object[key];\r\n      };\r\n    }\r\n\r\n    /**\r\n     * Produces a random number between `min` and `max` (inclusive). If only one\r\n     * argument is provided a number between `0` and the given number will be\r\n     * returned. If `floating` is truey or either `min` or `max` are floats a\r\n     * floating-point number will be returned instead of an integer.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} [min=0] The minimum possible value.\r\n     * @param {number} [max=1] The maximum possible value.\r\n     * @param {boolean} [floating=false] Specify returning a floating-point number.\r\n     * @returns {number} Returns a random number.\r\n     * @example\r\n     *\r\n     * _.random(0, 5);\r\n     * // => an integer between 0 and 5\r\n     *\r\n     * _.random(5);\r\n     * // => also an integer between 0 and 5\r\n     *\r\n     * _.random(5, true);\r\n     * // => a floating-point number between 0 and 5\r\n     *\r\n     * _.random(1.2, 5.2);\r\n     * // => a floating-point number between 1.2 and 5.2\r\n     */\r\n    function random(min, max, floating) {\r\n      var noMin = min == null,\r\n          noMax = max == null;\r\n\r\n      if (floating == null) {\r\n        if (typeof min == 'boolean' && noMax) {\r\n          floating = min;\r\n          min = 1;\r\n        }\r\n        else if (!noMax && typeof max == 'boolean') {\r\n          floating = max;\r\n          noMax = true;\r\n        }\r\n      }\r\n      if (noMin && noMax) {\r\n        max = 1;\r\n      }\r\n      min = +min || 0;\r\n      if (noMax) {\r\n        max = min;\r\n        min = 0;\r\n      } else {\r\n        max = +max || 0;\r\n      }\r\n      if (floating || min % 1 || max % 1) {\r\n        var rand = nativeRandom();\r\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);\r\n      }\r\n      return baseRandom(min, max);\r\n    }\r\n\r\n    /**\r\n     * Resolves the value of property `key` on `object`. If `key` is a function\r\n     * it will be invoked with the `this` binding of `object` and its result returned,\r\n     * else the property value is returned. If `object` is falsey then `undefined`\r\n     * is returned.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {Object} object The object to inspect.\r\n     * @param {string} key The name of the property to resolve.\r\n     * @returns {*} Returns the resolved value.\r\n     * @example\r\n     *\r\n     * var object = {\r\n     *   'cheese': 'crumpets',\r\n     *   'stuff': function() {\r\n     *     return 'nonsense';\r\n     *   }\r\n     * };\r\n     *\r\n     * _.result(object, 'cheese');\r\n     * // => 'crumpets'\r\n     *\r\n     * _.result(object, 'stuff');\r\n     * // => 'nonsense'\r\n     */\r\n    function result(object, key) {\r\n      if (object) {\r\n        var value = object[key];\r\n        return isFunction(value) ? object[key]() : value;\r\n      }\r\n    }\r\n\r\n    /**\r\n     * A micro-templating method that handles arbitrary delimiters, preserves\r\n     * whitespace, and correctly escapes quotes within interpolated code.\r\n     *\r\n     * Note: In the development build, `_.template` utilizes sourceURLs for easier\r\n     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n     *\r\n     * For more information on precompiling templates see:\r\n     * http://lodash.com/custom-builds\r\n     *\r\n     * For more information on Chrome extension sandboxes see:\r\n     * http://developer.chrome.com/stable/extensions/sandboxingEval.html\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} text The template text.\r\n     * @param {Object} data The data object used to populate the text.\r\n     * @param {Object} [options] The options object.\r\n     * @param {RegExp} [options.escape] The \"escape\" delimiter.\r\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\r\n     * @param {Object} [options.imports] An object to import into the template as local variables.\r\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\r\n     * @param {string} [sourceURL] The sourceURL of the template's compiled source.\r\n     * @param {string} [variable] The data object variable name.\r\n     * @returns {Function|string} Returns a compiled function when no `data` object\r\n     *  is given, else it returns the interpolated text.\r\n     * @example\r\n     *\r\n     * // using the \"interpolate\" delimiter to create a compiled template\r\n     * var compiled = _.template('hello <%= name %>');\r\n     * compiled({ 'name': 'fred' });\r\n     * // => 'hello fred'\r\n     *\r\n     * // using the \"escape\" delimiter to escape HTML in data property values\r\n     * _.template('<b><%- value %></b>', { 'value': '<script>' });\r\n     * // => '<b>&lt;script&gt;</b>'\r\n     *\r\n     * // using the \"evaluate\" delimiter to generate HTML\r\n     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the ES6 delimiter as an alternative to the default \"interpolate\" delimiter\r\n     * _.template('hello ${ name }', { 'name': 'pebbles' });\r\n     * // => 'hello pebbles'\r\n     *\r\n     * // using the internal `print` function in \"evaluate\" delimiters\r\n     * _.template('<% print(\"hello \" + name); %>!', { 'name': 'barney' });\r\n     * // => 'hello barney!'\r\n     *\r\n     * // using a custom template delimiters\r\n     * _.templateSettings = {\r\n     *   'interpolate': /{{([\\s\\S]+?)}}/g\r\n     * };\r\n     *\r\n     * _.template('hello {{ name }}!', { 'name': 'mustache' });\r\n     * // => 'hello mustache!'\r\n     *\r\n     * // using the `imports` option to import jQuery\r\n     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';\r\n     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });\r\n     * // => '<li>fred</li><li>barney</li>'\r\n     *\r\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\r\n     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });\r\n     * compiled(data);\r\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\r\n     *\r\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\r\n     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });\r\n     * compiled.source;\r\n     * // => function(data) {\r\n     *   var __t, __p = '', __e = _.escape;\r\n     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';\r\n     *   return __p;\r\n     * }\r\n     *\r\n     * // using the `source` property to inline compiled templates for meaningful\r\n     * // line numbers in error messages and a stack trace\r\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\r\n     *   var JST = {\\\r\n     *     \"main\": ' + _.template(mainText).source + '\\\r\n     *   };\\\r\n     * ');\r\n     */\r\n    function template(text, data, options) {\r\n      // based on John Resig's `tmpl` implementation\r\n      // http://ejohn.org/blog/javascript-micro-templating/\r\n      // and Laura Doktorova's doT.js\r\n      // https://github.com/olado/doT\r\n      var settings = lodash.templateSettings;\r\n      text = String(text || '');\r\n\r\n      // avoid missing dependencies when `iteratorTemplate` is not defined\r\n      options = defaults({}, options, settings);\r\n\r\n      var imports = defaults({}, options.imports, settings.imports),\r\n          importsKeys = keys(imports),\r\n          importsValues = values(imports);\r\n\r\n      var isEvaluating,\r\n          index = 0,\r\n          interpolate = options.interpolate || reNoMatch,\r\n          source = \"__p += '\";\r\n\r\n      // compile the regexp to match each delimiter\r\n      var reDelimiters = RegExp(\r\n        (options.escape || reNoMatch).source + '|' +\r\n        interpolate.source + '|' +\r\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\r\n        (options.evaluate || reNoMatch).source + '|$'\r\n      , 'g');\r\n\r\n      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\r\n        interpolateValue || (interpolateValue = esTemplateValue);\r\n\r\n        // escape characters that cannot be included in string literals\r\n        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);\r\n\r\n        // replace delimiters with snippets\r\n        if (escapeValue) {\r\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\r\n        }\r\n        if (evaluateValue) {\r\n          isEvaluating = true;\r\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\r\n        }\r\n        if (interpolateValue) {\r\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\r\n        }\r\n        index = offset + match.length;\r\n\r\n        // the JS engine embedded in Adobe products requires returning the `match`\r\n        // string in order to produce the correct `offset` value\r\n        return match;\r\n      });\r\n\r\n      source += \"';\\n\";\r\n\r\n      // if `variable` is not specified, wrap a with-statement around the generated\r\n      // code to add the data object to the top of the scope chain\r\n      var variable = options.variable,\r\n          hasVariable = variable;\r\n\r\n      if (!hasVariable) {\r\n        variable = 'obj';\r\n        source = 'with (' + variable + ') {\\n' + source + '\\n}\\n';\r\n      }\r\n      // cleanup code by stripping empty strings\r\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\r\n        .replace(reEmptyStringMiddle, '$1')\r\n        .replace(reEmptyStringTrailing, '$1;');\r\n\r\n      // frame code as the function body\r\n      source = 'function(' + variable + ') {\\n' +\r\n        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\\n') +\r\n        \"var __t, __p = '', __e = _.escape\" +\r\n        (isEvaluating\r\n          ? ', __j = Array.prototype.join;\\n' +\r\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\r\n          : ';\\n'\r\n        ) +\r\n        source +\r\n        'return __p\\n}';\r\n\r\n      // Use a sourceURL for easier debugging.\r\n      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl\r\n      var sourceURL = '\\n/*\\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\\n*/';\r\n\r\n      try {\r\n        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);\r\n      } catch(e) {\r\n        e.source = source;\r\n        throw e;\r\n      }\r\n      if (data) {\r\n        return result(data);\r\n      }\r\n      // provide the compiled function's source by its `toString` method, in\r\n      // supported environments, or the `source` property as a convenience for\r\n      // inlining compiled templates during the build process\r\n      result.source = source;\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * Executes the callback `n` times, returning an array of the results\r\n     * of each callback execution. The callback is bound to `thisArg` and invoked\r\n     * with one argument; (index).\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {number} n The number of times to execute the callback.\r\n     * @param {Function} callback The function called per iteration.\r\n     * @param {*} [thisArg] The `this` binding of `callback`.\r\n     * @returns {Array} Returns an array of the results of each `callback` execution.\r\n     * @example\r\n     *\r\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));\r\n     * // => [3, 6, 4]\r\n     *\r\n     * _.times(3, function(n) { mage.castSpell(n); });\r\n     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively\r\n     *\r\n     * _.times(3, function(n) { this.cast(n); }, mage);\r\n     * // => also calls `mage.castSpell(n)` three times\r\n     */\r\n    function times(n, callback, thisArg) {\r\n      n = (n = +n) > -1 ? n : 0;\r\n      var index = -1,\r\n          result = Array(n);\r\n\r\n      callback = baseCreateCallback(callback, thisArg, 1);\r\n      while (++index < n) {\r\n        result[index] = callback(index);\r\n      }\r\n      return result;\r\n    }\r\n\r\n    /**\r\n     * The inverse of `_.escape` this method converts the HTML entities\r\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their\r\n     * corresponding characters.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} string The string to unescape.\r\n     * @returns {string} Returns the unescaped string.\r\n     * @example\r\n     *\r\n     * _.unescape('Fred, Barney &amp; Pebbles');\r\n     * // => 'Fred, Barney & Pebbles'\r\n     */\r\n    function unescape(string) {\r\n      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);\r\n    }\r\n\r\n    /**\r\n     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Utilities\r\n     * @param {string} [prefix] The value to prefix the ID with.\r\n     * @returns {string} Returns the unique ID.\r\n     * @example\r\n     *\r\n     * _.uniqueId('contact_');\r\n     * // => 'contact_104'\r\n     *\r\n     * _.uniqueId();\r\n     * // => '105'\r\n     */\r\n    function uniqueId(prefix) {\r\n      var id = ++idCounter;\r\n      return String(prefix == null ? '' : prefix) + id;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * Creates a `lodash` object that wraps the given value with explicit\r\n     * method chaining enabled.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to wrap.\r\n     * @returns {Object} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney',  'age': 36 },\r\n     *   { 'name': 'fred',    'age': 40 },\r\n     *   { 'name': 'pebbles', 'age': 1 }\r\n     * ];\r\n     *\r\n     * var youngest = _.chain(characters)\r\n     *     .sortBy('age')\r\n     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })\r\n     *     .first()\r\n     *     .value();\r\n     * // => 'pebbles is 1'\r\n     */\r\n    function chain(value) {\r\n      value = new lodashWrapper(value);\r\n      value.__chain__ = true;\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Invokes `interceptor` with the `value` as the first argument and then\r\n     * returns `value`. The purpose of this method is to \"tap into\" a method\r\n     * chain in order to perform operations on intermediate results within\r\n     * the chain.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @param {*} value The value to provide to `interceptor`.\r\n     * @param {Function} interceptor The function to invoke.\r\n     * @returns {*} Returns `value`.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3, 4])\r\n     *  .tap(function(array) { array.pop(); })\r\n     *  .reverse()\r\n     *  .value();\r\n     * // => [3, 2, 1]\r\n     */\r\n    function tap(value, interceptor) {\r\n      interceptor(value);\r\n      return value;\r\n    }\r\n\r\n    /**\r\n     * Enables explicit method chaining on the wrapper object.\r\n     *\r\n     * @name chain\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapper object.\r\n     * @example\r\n     *\r\n     * var characters = [\r\n     *   { 'name': 'barney', 'age': 36 },\r\n     *   { 'name': 'fred',   'age': 40 }\r\n     * ];\r\n     *\r\n     * // without explicit chaining\r\n     * _(characters).first();\r\n     * // => { 'name': 'barney', 'age': 36 }\r\n     *\r\n     * // with explicit chaining\r\n     * _(characters).chain()\r\n     *   .first()\r\n     *   .pick('age')\r\n     *   .value();\r\n     * // => { 'age': 36 }\r\n     */\r\n    function wrapperChain() {\r\n      this.__chain__ = true;\r\n      return this;\r\n    }\r\n\r\n    /**\r\n     * Produces the `toString` result of the wrapped value.\r\n     *\r\n     * @name toString\r\n     * @memberOf _\r\n     * @category Chaining\r\n     * @returns {string} Returns the string result.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).toString();\r\n     * // => '1,2,3'\r\n     */\r\n    function wrapperToString() {\r\n      return String(this.__wrapped__);\r\n    }\r\n\r\n    /**\r\n     * Extracts the wrapped value.\r\n     *\r\n     * @name valueOf\r\n     * @memberOf _\r\n     * @alias value\r\n     * @category Chaining\r\n     * @returns {*} Returns the wrapped value.\r\n     * @example\r\n     *\r\n     * _([1, 2, 3]).valueOf();\r\n     * // => [1, 2, 3]\r\n     */\r\n    function wrapperValueOf() {\r\n      return this.__wrapped__;\r\n    }\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return wrapped values when chaining\r\n    lodash.after = after;\r\n    lodash.assign = assign;\r\n    lodash.at = at;\r\n    lodash.bind = bind;\r\n    lodash.bindAll = bindAll;\r\n    lodash.bindKey = bindKey;\r\n    lodash.chain = chain;\r\n    lodash.compact = compact;\r\n    lodash.compose = compose;\r\n    lodash.constant = constant;\r\n    lodash.countBy = countBy;\r\n    lodash.create = create;\r\n    lodash.createCallback = createCallback;\r\n    lodash.curry = curry;\r\n    lodash.debounce = debounce;\r\n    lodash.defaults = defaults;\r\n    lodash.defer = defer;\r\n    lodash.delay = delay;\r\n    lodash.difference = difference;\r\n    lodash.filter = filter;\r\n    lodash.flatten = flatten;\r\n    lodash.forEach = forEach;\r\n    lodash.forEachRight = forEachRight;\r\n    lodash.forIn = forIn;\r\n    lodash.forInRight = forInRight;\r\n    lodash.forOwn = forOwn;\r\n    lodash.forOwnRight = forOwnRight;\r\n    lodash.functions = functions;\r\n    lodash.groupBy = groupBy;\r\n    lodash.indexBy = indexBy;\r\n    lodash.initial = initial;\r\n    lodash.intersection = intersection;\r\n    lodash.invert = invert;\r\n    lodash.invoke = invoke;\r\n    lodash.keys = keys;\r\n    lodash.map = map;\r\n    lodash.mapValues = mapValues;\r\n    lodash.max = max;\r\n    lodash.memoize = memoize;\r\n    lodash.merge = merge;\r\n    lodash.min = min;\r\n    lodash.omit = omit;\r\n    lodash.once = once;\r\n    lodash.pairs = pairs;\r\n    lodash.partial = partial;\r\n    lodash.partialRight = partialRight;\r\n    lodash.pick = pick;\r\n    lodash.pluck = pluck;\r\n    lodash.property = property;\r\n    lodash.pull = pull;\r\n    lodash.range = range;\r\n    lodash.reject = reject;\r\n    lodash.remove = remove;\r\n    lodash.rest = rest;\r\n    lodash.shuffle = shuffle;\r\n    lodash.sortBy = sortBy;\r\n    lodash.tap = tap;\r\n    lodash.throttle = throttle;\r\n    lodash.times = times;\r\n    lodash.toArray = toArray;\r\n    lodash.transform = transform;\r\n    lodash.union = union;\r\n    lodash.uniq = uniq;\r\n    lodash.values = values;\r\n    lodash.where = where;\r\n    lodash.without = without;\r\n    lodash.wrap = wrap;\r\n    lodash.xor = xor;\r\n    lodash.zip = zip;\r\n    lodash.zipObject = zipObject;\r\n\r\n    // add aliases\r\n    lodash.collect = map;\r\n    lodash.drop = rest;\r\n    lodash.each = forEach;\r\n    lodash.eachRight = forEachRight;\r\n    lodash.extend = assign;\r\n    lodash.methods = functions;\r\n    lodash.object = zipObject;\r\n    lodash.select = filter;\r\n    lodash.tail = rest;\r\n    lodash.unique = uniq;\r\n    lodash.unzip = zip;\r\n\r\n    // add functions to `lodash.prototype`\r\n    mixin(lodash);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions that return unwrapped values when chaining\r\n    lodash.clone = clone;\r\n    lodash.cloneDeep = cloneDeep;\r\n    lodash.contains = contains;\r\n    lodash.escape = escape;\r\n    lodash.every = every;\r\n    lodash.find = find;\r\n    lodash.findIndex = findIndex;\r\n    lodash.findKey = findKey;\r\n    lodash.findLast = findLast;\r\n    lodash.findLastIndex = findLastIndex;\r\n    lodash.findLastKey = findLastKey;\r\n    lodash.has = has;\r\n    lodash.identity = identity;\r\n    lodash.indexOf = indexOf;\r\n    lodash.isArguments = isArguments;\r\n    lodash.isArray = isArray;\r\n    lodash.isBoolean = isBoolean;\r\n    lodash.isDate = isDate;\r\n    lodash.isElement = isElement;\r\n    lodash.isEmpty = isEmpty;\r\n    lodash.isEqual = isEqual;\r\n    lodash.isFinite = isFinite;\r\n    lodash.isFunction = isFunction;\r\n    lodash.isNaN = isNaN;\r\n    lodash.isNull = isNull;\r\n    lodash.isNumber = isNumber;\r\n    lodash.isObject = isObject;\r\n    lodash.isPlainObject = isPlainObject;\r\n    lodash.isRegExp = isRegExp;\r\n    lodash.isString = isString;\r\n    lodash.isUndefined = isUndefined;\r\n    lodash.lastIndexOf = lastIndexOf;\r\n    lodash.mixin = mixin;\r\n    lodash.noConflict = noConflict;\r\n    lodash.noop = noop;\r\n    lodash.now = now;\r\n    lodash.parseInt = parseInt;\r\n    lodash.random = random;\r\n    lodash.reduce = reduce;\r\n    lodash.reduceRight = reduceRight;\r\n    lodash.result = result;\r\n    lodash.runInContext = runInContext;\r\n    lodash.size = size;\r\n    lodash.some = some;\r\n    lodash.sortedIndex = sortedIndex;\r\n    lodash.template = template;\r\n    lodash.unescape = unescape;\r\n    lodash.uniqueId = uniqueId;\r\n\r\n    // add aliases\r\n    lodash.all = every;\r\n    lodash.any = some;\r\n    lodash.detect = find;\r\n    lodash.findWhere = find;\r\n    lodash.foldl = reduce;\r\n    lodash.foldr = reduceRight;\r\n    lodash.include = contains;\r\n    lodash.inject = reduce;\r\n\r\n    mixin(function() {\r\n      var source = {}\r\n      forOwn(lodash, function(func, methodName) {\r\n        if (!lodash.prototype[methodName]) {\r\n          source[methodName] = func;\r\n        }\r\n      });\r\n      return source;\r\n    }(), false);\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    // add functions capable of returning wrapped and unwrapped values when chaining\r\n    lodash.first = first;\r\n    lodash.last = last;\r\n    lodash.sample = sample;\r\n\r\n    // add aliases\r\n    lodash.take = first;\r\n    lodash.head = first;\r\n\r\n    forOwn(lodash, function(func, methodName) {\r\n      var callbackable = methodName !== 'sample';\r\n      if (!lodash.prototype[methodName]) {\r\n        lodash.prototype[methodName]= function(n, guard) {\r\n          var chainAll = this.__chain__,\r\n              result = func(this.__wrapped__, n, guard);\r\n\r\n          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))\r\n            ? result\r\n            : new lodashWrapper(result, chainAll);\r\n        };\r\n      }\r\n    });\r\n\r\n    /*--------------------------------------------------------------------------*/\r\n\r\n    /**\r\n     * The semantic version number.\r\n     *\r\n     * @static\r\n     * @memberOf _\r\n     * @type string\r\n     */\r\n    lodash.VERSION = '2.4.1';\r\n\r\n    // add \"Chaining\" functions to the wrapper\r\n    lodash.prototype.chain = wrapperChain;\r\n    lodash.prototype.toString = wrapperToString;\r\n    lodash.prototype.value = wrapperValueOf;\r\n    lodash.prototype.valueOf = wrapperValueOf;\r\n\r\n    // add `Array` functions that return unwrapped values\r\n    forEach(['join', 'pop', 'shift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        var chainAll = this.__chain__,\r\n            result = func.apply(this.__wrapped__, arguments);\r\n\r\n        return chainAll\r\n          ? new lodashWrapper(result, chainAll)\r\n          : result;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return the existing wrapped value\r\n    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        func.apply(this.__wrapped__, arguments);\r\n        return this;\r\n      };\r\n    });\r\n\r\n    // add `Array` functions that return new wrapped values\r\n    forEach(['concat', 'slice', 'splice'], function(methodName) {\r\n      var func = arrayRef[methodName];\r\n      lodash.prototype[methodName] = function() {\r\n        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);\r\n      };\r\n    });\r\n\r\n    return lodash;\r\n  }\r\n\r\n  /*--------------------------------------------------------------------------*/\r\n\r\n  // expose Lo-Dash\r\n  var _ = runInContext();\r\n\r\n  // some AMD build optimizers like r.js check for condition patterns like the following:\r\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\r\n    // Expose Lo-Dash to the global object even when an AMD loader is present in\r\n    // case Lo-Dash is loaded with a RequireJS shim config.\r\n    // See http://requirejs.org/docs/api.html#config-shim\r\n    root._ = _;\r\n\r\n    // define as an anonymous module so, through path mapping, it can be\r\n    // referenced as the \"underscore\" module\r\n    define(function() {\r\n      return _;\r\n    });\r\n  }\r\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\r\n  else if (freeExports && freeModule) {\r\n    // in Node.js or RingoJS\r\n    if (moduleExports) {\r\n      (freeModule.exports = _)._ = _;\r\n    }\r\n    // in Narwhal or Rhino -require\r\n    else {\r\n      freeExports._ = _;\r\n    }\r\n  }\r\n  else {\r\n    // in a browser or Rhino\r\n    root._ = _;\r\n  }\r\n}.call(this));\r\n\r\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\r\n},{}]},{},[1])(1)\r\n});\n/**\r\n * Visualize span annotations as a tree\r\n * using Dagre.\r\n *\r\n * This should be lazy loaded!\r\n */\r\n\r\n\r\ndefine('match/treehierarchy',['lib/dagre'], function (dagre) {\r\n\r\n  const d = document;\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n\r\n  // Node size\r\n  var WIDTH  = 55, HEIGHT = 20, LINEHEIGHT = 14;\r\n\r\n  // Create path for node connections \r\n  function _line (src, target) {\r\n    const x1 = src.x,\r\n          y1 = src.y,\r\n          x2 = target.x,\r\n          y2 = target.y - target.height / 2;\r\n\r\n    // c 0,0 -10,0\r\n    return 'M ' + x1 + ',' + y1 + ' ' + \r\n      'C ' + x1 + ',' + y1 + ' ' + \r\n      x2 + ',' + (y2 - (y2 - y1) / 2)  + ' ' + \r\n      x2 + ',' + y2;\r\n  };\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new tree visualization based\r\n     * on a match snippet.\r\n     */\r\n    create : function (snippet) {\r\n      return Object.create(this).\r\n        _init(snippet);\r\n    },\r\n\r\n\r\n    // Initialize the tree based on a snippet.\r\n    _init : function (snippet) {\r\n      this._next = new Number(0);\r\n      \r\n      // Create html for traversal\r\n      let html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      const g = new dagre.graphlib.Graph({\r\n        \"directed\" : true \r\n      });\r\n\r\n      g.setGraph({\r\n        \"nodesep\" : 35,\r\n        \"ranksep\" : 15,\r\n        \"marginx\" : 40,\r\n        \"marginy\" : 10\r\n      });\r\n      g.setDefaultEdgeLabel({});\r\n\r\n      this._graph = g;\r\n      \r\n      // This is a new root\r\n      this._addNode(\r\n        this._next++,\r\n        { \"class\" : \"root\" }\r\n      );\r\n      \r\n      // Parse nodes from root\r\n      this._parse(0, html.childNodes, undefined);\r\n\r\n      // Root node has only one child - remove\r\n      if (g.outEdges(0).length === 1)\r\n        g.removeNode(0);\r\n\r\n      html = undefined;\r\n      return this;\r\n    },\r\n\r\n\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n    \r\n\r\n    /**\r\n     * The number of nodes in the tree.\r\n     */\r\n    nodes : function () {\r\n      return this._next;\r\n    },\r\n\r\n\r\n    // Add new node to graph\r\n    _addNode : function (id, obj) {\r\n      obj[\"width\"]  = WIDTH;\r\n      obj[\"height\"] = HEIGHT;\r\n      this._graph.setNode(id, obj)\r\n      return obj;\r\n    },\r\n    \r\n\r\n    // Add new edge to graph\r\n    _addEdge : function (src, target) {\r\n      this._graph.setEdge(src, target);\r\n    },\r\n    \r\n\r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Parse the snippet\r\n    _parse : function (parent, children, mark) {\r\n      children.forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          // Get title from html\r\n          if (c.getAttribute(\"title\")) {\r\n\r\n            // Add child node\r\n            const id = this._next++;\r\n\r\n            const obj = this._addNode(id, {\r\n              \"class\" : \"middle\",\r\n              \"label\" : this._clean(c.getAttribute(\"title\"))\r\n            });\r\n            \r\n            if (mark !== undefined) {\r\n              obj.class += ' mark';\r\n            };\r\n            \r\n            this._addEdge(parent, id);\r\n\r\n            // Check for next level\r\n            if (c.hasChildNodes())\r\n              this._parse(id, c.childNodes, mark);\r\n          }\r\n\r\n          // Step further\r\n          else if (c.hasChildNodes()) {\r\n\r\n            this._parse(\r\n              parent,\r\n              c.childNodes,\r\n              c.tagName === 'MARK' ? true : mark\r\n            );\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3)\r\n\r\n          if (c.nodeValue.match(/[-a-z0-9]/i)) {\r\n            \r\n            // Add child node\r\n            const id = this._next++;\r\n            this._addNode(id, {\r\n              \"class\" : \"leaf\",\r\n              \"label\" : c.nodeValue\r\n            });\r\n\r\n            this._addEdge(parent, id);\r\n          };\r\n      }, this);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Dummy method to be compatible with relTree\r\n    show : function () {\r\n      return;\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to relations\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n        return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n        treeDiv.scrollLeft = (cWidth - treeWidth) / 2;\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Create svg and serialize as base64\r\n     */\r\n    toBase64 : function () {\r\n\r\n      // First clone element\r\n      const svgWrapper = d.createElement('div')\r\n      svgWrapper.innerHTML = this.element().outerHTML;\r\n\r\n      const svg = svgWrapper.firstChild;\r\n      const style = this._c('style');\r\n\r\n      svg.getElementsByTagName('defs')[0].appendChild(style);\r\n\r\n      style.innerHTML = \r\n\t      'path.edge '  +            '{ stroke: black; stroke-width: 2pt; fill: none; }' +\r\n        'g.root rect.empty,' +\r\n        'g.middle rect' +          '{ stroke: black; stroke-width: 2pt; fill: #bbb; }' +\r\n        'g.leaf > rect ' +         '{ display: none }' +\r\n        'g > text > tspan ' +      '{ text-anchor: middle; font-size: 9pt }' +\r\n        'g.leaf > text > tspan ' + '{ font-size: 10pt; overflow: visible; }';\r\n\r\n      return btoa(unescape(encodeURIComponent(svg.outerHTML)).replace(/&nbsp;/g, ' '));\r\n    },\r\n    \r\n\r\n    /**\r\n     * Get the dom element of the tree view.\r\n     */\r\n    element : function () {\r\n\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      const g = this._graph;\r\n      dagre.layout(g);\r\n      \r\n      const canvas = this._c('svg');\r\n      this._el = canvas;\r\n\r\n      canvas.appendChild(this._c('defs'));\r\n\r\n      // Create edges\r\n      const that = this;\r\n\r\n      let src, target, p;\r\n\r\n      g.edges().forEach(\r\n        function (e) {\r\n          src = g.node(e.v);\r\n          target = g.node(e.w);\r\n          p = that._c('path');\r\n          p.setAttributeNS(null, \"d\", _line(src, target));\r\n          p.classList.add('edge');\r\n          canvas.appendChild(p);\r\n        }\r\n      );\r\n      \r\n      let height = g.graph().height;\r\n\r\n      // Create nodes\r\n      g.nodes().forEach(\r\n        function (v) {\r\n          v = g.node(v);\r\n          const group = that._c('g');\r\n          group.setAttribute('class', v.class);\r\n          \r\n          // Add node box\r\n          const rect = group.appendChild(that._c('rect'));\r\n          rect.setAttribute('x', v.x - v.width / 2);\r\n          rect.setAttribute('y', v.y - v.height / 2);\r\n          rect.setAttribute('rx', 5);\r\n          rect.setAttribute('ry', 5);\r\n          rect.setAttribute('width', v.width);\r\n          rect.setAttribute('height', v.height);\r\n\r\n          if (v.class === 'root' && v.label === undefined) {\r\n            rect.setAttribute('width', v.height);\r\n            rect.setAttribute('x', v.x - v.height / 2);\r\n            rect.setAttribute('class', 'empty');\r\n          };\r\n\r\n          // Add label\r\n          if (v.label !== undefined) {\r\n            const text = group.appendChild(that._c('text'));\r\n            let y = v.y - v.height / 2;\r\n            text.setAttribute('y', y);\r\n            text.setAttribute(\r\n              'transform',\r\n              'translate(' + v.width/2 + ',' + ((v.height / 2) + 5) + ')'\r\n            );\r\n\r\n            const vLabel = v.label.replace(/&nbsp;/g, \" \")\r\n                  .replace(/&amp;/g, '&')\r\n                  .replace(/&lt;/g, '<')\r\n                  .replace(/&gt;/g, '>');\r\n            \r\n            if (v.class === \"leaf\") {\r\n              text.setAttribute('title', vLabel);\r\n\r\n              let n = 0;\r\n              let tspan;\r\n              vLabel.split(\" \").forEach(function(p) {\r\n                if (p.length === 0)\r\n                  return;\r\n\r\n                tspan = that._c('tspan');\r\n                tspan.appendChild(d.createTextNode(p));\r\n\r\n                if (n !== 0)\r\n                  tspan.setAttribute('dy', LINEHEIGHT + 'pt');\r\n                else\r\n                  n = 1;\r\n\r\n                tspan.setAttribute('x', v.x - v.width / 2);\r\n                y += LINEHEIGHT;\r\n                text.appendChild(tspan);\r\n              });\r\n\r\n              y += LINEHEIGHT;\r\n\r\n              // The text is below the canvas - readjust the height!\r\n              if (y > height)\r\n                height = y;\r\n            }\r\n            else {\r\n              const tspan = that._c('tspan');\r\n              tspan.appendChild(d.createTextNode(vLabel));\r\n              tspan.setAttribute('x', v.x - v.width / 2);\r\n              text.appendChild(tspan);\r\n            };\r\n          };\r\n          canvas.appendChild(group);\r\n        }\r\n      );\r\n\r\n      canvas.setAttribute('width', g.graph().width);\r\n      canvas.setAttribute('height', height);\r\n      return this._el;\r\n    },\r\n    \r\n    downloadLink : function () {\r\n      const a = d.createElement('a');\r\n      a.setAttribute('href-lang', 'image/svg+xml');\r\n      a.setAttribute('href', 'data:image/svg+xml;base64,' + this.toBase64());\r\n      a.setAttribute('download', 'tree.svg');\r\n      a.target = '_blank';\r\n      a.setAttribute('rel', 'noopener noreferrer');\r\n      return a;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Parse a relational tree and visualize using arcs.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('match/treearc',[], function () {\r\n\r\n  const svgNS = \"http://www.w3.org/2000/svg\";\r\n  const _TermRE = new RegExp(\"^(?:([^\\/]+?)\\/)?([^:]+?):(.+?)$\");\r\n  const d = document;\r\n\r\n  return {\r\n    create : function (snippet) {\r\n      return Object.create(this)._init(snippet);\r\n    },\r\n\r\n    // Initialize the state of the object\r\n    _init : function (snippet) {\r\n\r\n      const t = this;\r\n\r\n      // Predefine some values\r\n      t._tokens  = [];\r\n      t._arcs    = [];\r\n      t._tokenElements = [];\r\n      t._y = 0;\r\n      t._currentInFocus = undefined;\r\n\r\n      // Some configurations\r\n      t.maxArc      = 200; // maximum height of the bezier control point\r\n      t.overlapDiff = 40;  // Difference on overlaps and minimum height for self-refernces\r\n      t.arcDiff     = 15;\r\n      t.anchorDiff  = 8;\r\n      t.anchorStart = 15;\r\n      t.tokenSep    = 30;\r\n      t.xPadding    = 10;\r\n      t.yPadding    = 5;\r\n\r\n      // No snippet to process\r\n      if (snippet == undefined || snippet == null)\r\n        return t;\r\n\r\n      // Parse the snippet\r\n      const html = d.createElement(\"div\");\r\n      html.innerHTML = snippet;\r\n\r\n      // Establish temporary parsing memory\r\n      t.temp = {\r\n        target : {}, // Remember the map id => pos        \r\n        edges  : [], // Remember edge definitions\r\n        pos    : 0   // Keep track of the current token position\r\n      };\r\n\r\n      // Start parsing from root\r\n      t._parse(0, html.childNodes, undefined);\r\n\r\n      // Establish edge list\r\n      const targetMap = t.temp['target'];\r\n      const edges = t.temp['edges'];\r\n\r\n      let targetID, target, relation;\r\n      \r\n      // Iterate over edge lists\r\n      // TODO:\r\n      //   Support spans for anchors!\r\n      edges.forEach(function(edge) {\r\n\r\n        // Check the target identifier\r\n        targetID = edge.targetID;\r\n        target = targetMap[targetID];\r\n\r\n        if (target != undefined) {\r\n\r\n          // Check if the source is a span anchor\r\n          /*\r\n          var start = edge.srcStart;\r\n          if (start !== edge.srcEnd) {\r\n            start = [start, edge.srcEnd];\r\n          };\r\n          */\r\n          \r\n          // Add relation\r\n          relation = {\r\n            start : [edge.srcStart, edge.srcEnd],\r\n            end : target,\r\n            direction : 'uni',\r\n            label : edge.label\r\n          };\r\n          // console.log(relation);\r\n          this.addRel(relation);\r\n        };\r\n      }, t);\r\n\r\n      // Reset parsing memory\r\n      delete t[\"temp\"];\r\n\r\n      return this;\r\n    },\r\n\r\n    // Parse a node of the tree snippet\r\n    _parse : function (parent, children, mark) {\r\n\r\n      // Iterate over all child nodes\r\n      Array.from(children).forEach(function(c) {\r\n\r\n        // Element node\r\n        if (c.nodeType == 1) {\r\n\r\n          let xmlid, target, start, end;\r\n\r\n          // Node is an identifier\r\n          if (c.hasAttribute('xml:id')) {\r\n\r\n            // Remember that pos has this identifier\r\n            xmlid = c.getAttribute('xml:id');\r\n            // this.temp['target'][xmlid] =\r\n            start = this.temp['pos'];\r\n            end = this.temp['pos'];\r\n          }\r\n\r\n          // Node is a link\r\n          // Stricter: && c.hasAttribute('xlink:show')\r\n          else if (c.hasAttribute('xlink:href')) {\r\n\r\n            // Node is a continuation\r\n            if (c.getAttribute('xlink:show') == \"other\" &&\r\n                c.hasAttribute('data-action') &&\r\n                c.getAttribute('data-action') == \"join\"\r\n               ) {\r\n              xmlid = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n              start = this.temp['pos'];\r\n              end = this.temp['pos'];\r\n\r\n              // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n              // console.log(\"Here\");\r\n            }\r\n\r\n            // Node is a relation\r\n            // Stricter: c.getAttribute('xlink:show') == \"none\"\r\n            else {\r\n              let label;\r\n\r\n              // Get target id\r\n              target = c.getAttribute('xlink:href').replace(/^#/, \"\");\r\n\r\n              if (c.hasAttribute('xlink:title')) {\r\n                label = this._clean(c.getAttribute('xlink:title'));\r\n              };\r\n\r\n              // Remember the defined edge\r\n// WRONG!\r\n              var edge = {\r\n                label    : label,\r\n                srcStart : this.temp['pos'],\r\n                targetID : target\r\n              };\r\n\r\n              // TEMP: Hot-fix for root relations\r\n              if (!label.match(/--$/) && !label.match(/ROOT$/)) {\r\n                this.temp['edges'].push(edge);\r\n              };\r\n\r\n            };\r\n          };\r\n\r\n          // Go on with child nodes\r\n          if (c.hasChildNodes()) {\r\n            this._parse(0, c.childNodes, mark);\r\n          };\r\n\r\n\r\n          // The element is a defined anchor\r\n          if (xmlid !== undefined) {\r\n\r\n            // this.temp['target'][xmlid][1] = this.temp['pos'] -1;\r\n\r\n            // Element already defined\r\n            if (this.temp['target'][xmlid] !== undefined) {\r\n              const newtarget = this.temp['target'][xmlid];\r\n              end = this.temp['pos'] - 1;\r\n              newtarget[0] = start < newtarget[0] ? start : newtarget[0];\r\n              newtarget[1] = end > newtarget[1] ? end : newtarget[1];\r\n            }\r\n\r\n            // Element not yet defined\r\n            else {\r\n              end = this.temp['pos'] - 1;\r\n              this.temp['target'][xmlid] = [start, end];\r\n            };\r\n\r\n            /*\r\n            console.log('Target ' + xmlid + ' spans from ' +\r\n                        this.temp['target'][xmlid][0] +\r\n                        ' to ' +\r\n                        this.temp['target'][xmlid][1]\r\n                       );\r\n            */\r\n            xmlid = undefined;\r\n          }\r\n\r\n          // Current element describes an arc\r\n          else if (target !== undefined) {\r\n\r\n            // TODO: This does not work yet!\r\n            edge[\"srcEnd\"] = this.temp['pos'] -1;\r\n            // console.log('Here');\r\n\r\n            /*\r\n            console.log('Source spans from ' +\r\n                        edge[\"srcStart\"] +\r\n                        ' to ' +\r\n                        edge[\"srcEnd\"]\r\n                       );\r\n            */\r\n            target = undefined;\r\n          };\r\n        }\r\n\r\n        // Text node\r\n        else if (c.nodeType == 3) {\r\n\r\n          // Check, if there is a non-whitespace token\r\n          if (c.nodeValue !== undefined) {\r\n\r\n            const str = c.nodeValue.trim();\r\n\r\n            if (str !== undefined && str.length > 0) {\r\n\r\n              // Add token to token list\r\n              this.addToken(str);\r\n\r\n              // Move token position\r\n              this.temp['pos']++;\r\n            };\r\n          };\r\n        };\r\n      }, this);\r\n\r\n      // Todo: define edges here!\r\n    },\r\n\r\n    \r\n    // Remove foundry and layer for labels\r\n    _clean : function (title) {\r\n      return title.replace(_TermRE, \"$3\");\r\n    },\r\n\r\n    \r\n    // Return the number of leaf nodes\r\n    // (not necessarily part of a relation).\r\n    // Consecutive nodes that are not part of any\r\n    // relation are summarized in one node.\r\n    size : function () {\r\n      return this._tokens.length;\r\n    },\r\n\r\n    \r\n    // This is a shorthand for SVG element creation\r\n    _c : function (tag) {\r\n      return d.createElementNS(svgNS, tag);\r\n    },\r\n\r\n\r\n    // Get bounding box - with workaround for text nodes\r\n    _rect : function (node) {\r\n      if (node.tagName == \"tspan\" && !navigator.userAgent.match(/Edge/)) {\r\n        const range = d.createRange();\r\n        range.selectNode(node);\r\n        const rect = range.getBoundingClientRect();\r\n        range.detach();\r\n        return rect;\r\n      };\r\n      return node.getBoundingClientRect();\r\n    },\r\n\r\n\r\n    // Returns the center point of the requesting token\r\n    _tokenPoint : function (node) {\r\n\t    const box = this._rect(node);\r\n\t    return box.left + (box.width / 2);\r\n    },\r\n\r\n\r\n    // Draws an anchor\r\n    _drawAnchor : function (anchor) {\r\n\r\n      // Calculate the span of the first and last token, the anchor spans\r\n      const firstBox = this._rect(this._tokenElements[anchor.first]);\r\n      const lastBox  = this._rect(this._tokenElements[anchor.last]);\r\n\t\r\n      const y = this._y + (anchor.overlaps * this.anchorDiff) - this.anchorStart;\r\n      const l = this._c('path');\r\n      \r\n\t    this._arcsElement.appendChild(l);\r\n\r\n      const pathStr = \"M \" +\r\n          (firstBox.left - this.offsetLeft) +\r\n          \",\" +\r\n          y +\r\n          \" L \" +\r\n          (lastBox.right - this.offsetLeft) +\r\n          \",\" + y;\r\n\r\n      l.setAttribute(\"d\", pathStr);\r\n      l.setAttribute(\"class\", \"anchor\");\r\n      anchor.element = l;\r\n      anchor.y = y;\r\n      return l;\r\n    },\r\n    \r\n\r\n    // Create an arc with an optional label\r\n    // Potentially needs a height parameter for stacks\r\n    _drawArc : function (arc) {\r\n\r\n      const t = this;\r\n      let startPos, endPos;\r\n      let startY = this._y;\r\n      let endY = this._y;\r\n\t\r\n      if (arc.startAnchor !== undefined) {\r\n        startPos = t._tokenPoint(arc.startAnchor.element);\r\n        startY = arc.startAnchor.y;\r\n      }\r\n      else {\r\n        startPos = t._tokenPoint(t._tokenElements[arc.first]);\r\n      };\r\n\r\n      if (arc.endAnchor !== undefined) {\r\n        endPos = t._tokenPoint(arc.endAnchor.element)\r\n        endY = arc.endAnchor.y;\r\n      }\r\n      else {\r\n        endPos = t._tokenPoint(t._tokenElements[arc.last]);\r\n      };\r\n\r\n      startPos -= t.offsetLeft;\r\n      endPos -= t.offsetLeft;\r\n\r\n\t    // Special treatment for self-references\r\n      var overlaps = arc.overlaps;\r\n      if (startPos == endPos) {\r\n        startPos -= t.overlapDiff / 3;\r\n        endPos   += t.overlapDiff / 3;\r\n        overlaps += .5;\r\n      };\r\n\r\n      const g = t._c(\"g\");\r\n      g.setAttribute(\"class\", \"arc\");\r\n      const p = g.appendChild(t._c(\"path\"));\r\n      p.setAttribute('class', 'edge');\r\n      \r\n      // Attach the new arc before drawing, so computed values are available\r\n      t._arcsElement.appendChild(g);\r\n\r\n      // Create arc\r\n      let middle = Math.abs(endPos - startPos) / 2;\r\n\r\n      // TODO:\r\n      //   take the number of tokens into account!\r\n      let cHeight = t.arcDiff + (overlaps * t.overlapDiff) + (middle / 2);\r\n\r\n      // Respect the maximum height\r\n      cHeight = cHeight < t.maxArc ? cHeight : t.maxArc;\r\n\r\n      var x = Math.min(startPos, endPos);\r\n\r\n      //var controlY = (startY + endY - cHeight);\r\n      let controlY = (endY - cHeight);\r\n      \r\n      const arcE = \"M \"+ startPos + \",\" + startY +\r\n          \" C \" + startPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + controlY +\r\n          \" \" + endPos + \",\" + endY;\r\n\r\n      p.setAttribute(\"d\", arcE);\r\n\r\n      if (arc.direction !== undefined) {\r\n        p.setAttribute(\"marker-end\", \"url(#arr)\");\r\n        if (arc.direction === 'bi') {\r\n          p.setAttribute(\"marker-start\", \"url(#arr)\");\r\n        };\r\n      };\r\n\r\n      if (arc.label === undefined)\r\n        return g;\r\n      \r\n      /*\r\n       * Calculate the top point of the arc for labeling using\r\n       * de Casteljau's algorithm, see e.g.\r\n       * http://blog.sklambert.com/finding-the-control-points-of-a-bezier-curve/\r\n       * of course simplified to symmetric arcs ...\r\n       */\r\n      // Interpolate one side of the control polygon\r\n      let middleY = (((startY + controlY) / 2) + controlY) / 2;\r\n\r\n      // Create a boxed label\r\n      const label = this._c(\"g\");\r\n      label.setAttribute(\"class\", \"label\");\r\n      t._labelsElement.appendChild(label);\r\n\r\n      // Set arc reference\r\n      label.arcRef = g;\r\n\r\n      const that = t;\r\n      label.addEventListener('mouseenter', function () {\r\n        that.inFocus(this);\r\n      });\r\n\r\n      const labelE = label.appendChild(t._c(\"text\"));\r\n      labelE.setAttribute(\"x\", x + middle);\r\n      labelE.setAttribute(\"y\", middleY + 3);\r\n      labelE.setAttribute(\"text-anchor\", \"middle\");\r\n      const textNode = d.createTextNode(arc.label);\r\n      labelE.appendChild(textNode);\r\n\r\n      const labelBox   = labelE.getBBox();\r\n\r\n      /*\r\n      if (!labelBox)\r\n        console.log(\"----\");\r\n      */\r\n      \r\n      const textWidth  = labelBox.width; // labelE.getComputedTextLength();\r\n      const textHeight = labelBox.height; // labelE.getComputedTextLength();\r\n\r\n      // Add box with padding to left and right\r\n      const labelR = label.insertBefore(t._c(\"rect\"), labelE);\r\n      const boxWidth = textWidth + 2 * t.xPadding;\r\n      labelR.setAttribute(\"x\", x + middle - (boxWidth / 2));\r\n      labelR.setAttribute(\"ry\", 5);\r\n      labelR.setAttribute(\"y\", labelBox.y - t.yPadding);\r\n      labelR.setAttribute(\"width\", boxWidth);\r\n      labelR.setAttribute(\"height\", textHeight + 2 * t.yPadding);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the svg element\r\n     */\r\n    element : function () {\r\n      if (this._el !== undefined)\r\n        return this._el;\r\n\r\n      // Create svg\r\n      const svg = this._c(\"svg\");\r\n\r\n      window.addEventListener(\"resize\", function () {\r\n        // TODO:\r\n        //   Only if text-size changed!\r\n        // TODO:\r\n        //   This is currently untested\r\n        this.show();\r\n      }.bind(this));\r\n\r\n      // Define marker arrows\r\n      const defs = svg.appendChild(this._c(\"defs\"));\r\n      const marker = defs.appendChild(this._c(\"marker\"));\r\n      marker.setAttribute(\"refX\", 9);\r\n      marker.setAttribute(\"id\", \"arr\");\r\n      marker.setAttribute(\"orient\", \"auto-start-reverse\");\r\n      marker.setAttribute(\"markerUnits\",\"userSpaceOnUse\");\r\n\r\n      const arrow = this._c(\"path\");\r\n      arrow.setAttribute(\"transform\", \"scale(0.8)\");\r\n      arrow.setAttribute(\"d\", \"M 0,-5 0,5 10,0 Z\");\r\n      marker.appendChild(arrow);\r\n\r\n      this._el = svg;\r\n      return this._el;\r\n    },\r\n\r\n\r\n    // Add a relation with a start, an end,\r\n    // a direction value and an optional label text\r\n    addRel : function (rel) {\r\n      this._arcs.push(rel);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Add a token to the list (this will mostly be a word)\r\n    addToken : function(token) {\r\n      this._tokens.push(token);\r\n      return this;\r\n    },\r\n\r\n\r\n    // Move label and arc in focus\r\n    inFocus : function (element) {\r\n      let cif;\r\n\r\n      if (this._currentInFocus) {\r\n\r\n        // Already in focus\r\n        if (this._currentInFocus === element)\r\n          return;\r\n\r\n        cif = this._currentInFocus;\r\n        cif.classList.remove('infocus');\r\n        cif.arcRef.classList.remove('infocus');\r\n      };\r\n\r\n      cif = this._currentInFocus = element;\r\n      this._labelsElement.appendChild(cif);\r\n      this._arcsElement.appendChild(cif.arcRef);\r\n      cif.classList.add('infocus');\r\n      cif.arcRef.classList.add('infocus');\r\n    },\r\n    \r\n\r\n    /*\r\n     * All arcs need to be sorted before shown,\r\n     * to avoid nesting.\r\n     */\r\n    _sortArcs : function () {\r\n\r\n      // TODO:\r\n      //   Keep in mind that the arcs may have long anchors!\r\n      //   1. Iterate over all arcs\r\n      //   2. Sort all multi\r\n      let anchors = {};\r\n      \r\n      // 1. Sort by length\r\n      // 2. Tag all spans with the number of overlaps before\r\n      //    a) Iterate over all spans\r\n      //    b) check the latest preceeding overlapping span (lpos)\r\n      //       -> not found: tag with 0\r\n      //       -> found: Add +1 to the level of the (lpos)\r\n      //    c) If the new tag is smaller than the previous element,\r\n      //       reorder\r\n\r\n      // Normalize start and end\r\n      const sortedArcs = this._arcs.map(function (v) {\r\n\r\n        // Check for long anchors\r\n        if (v.start instanceof Array) {\r\n\r\n          if (v.start[0] == v.start[1]) {\r\n            v.start = v.start[0];\r\n          }\r\n\r\n          else {\r\n          \r\n            const middle = Math.ceil(Math.abs(v.start[1] - v.start[0]) / 2) + v.start[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.start[0] + \"_\" + v.start[1];\r\n\r\n            // Reverse signature\r\n            if (v.start[0] > v.start[1]) {\r\n              anchorSig = \"#\" + v.start[1] + \"_\" + v.start[0];\r\n            };\r\n            \r\n            // Check if the anchor already exist\r\n            let anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.start[0],\r\n                \"last\" :   v.start[1],\r\n                \"length\" : v.start[1] - v.start[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n\r\n            v.startAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.start = middle;\r\n          };\r\n        };\r\n\r\n        if (v.end instanceof Array) {\r\n\r\n          if (v.end[0] == v.end[1]) {\r\n            v.end = v.end[0];\r\n          }\r\n\r\n          else {\r\n\r\n            const middle = Math.abs(v.end[0] - v.end[1]) + v.end[0];\r\n\r\n            // Calculate signature to avoid multiple anchors\r\n            let anchorSig = \"#\" + v.end[0] + \"_\" + v.end[1];\r\n\r\n            // Reverse signature\r\n            if (v.end[0] > v.end[1]) {\r\n              anchorSig = \"#\" + v.end[1] + \"_\" + v.end[0];\r\n            };\r\n\r\n            // Check if the anchor already exist\r\n            var anchor = anchors[anchorSig];\r\n            if (anchor === undefined) {\r\n              anchor = {\r\n                \"first\":   v.end[0],\r\n                \"last\" :   v.end[1],\r\n                \"length\" : v.end[1] - v.end[0]\r\n              };\r\n              anchors[anchorSig] = anchor;\r\n            };\r\n            \r\n            v.endAnchor = anchor;\r\n\r\n            // Add to anchors list\r\n            v.end = middle;\r\n          };\r\n        };\r\n\r\n        v.first = v.start;\r\n        v.last  = v.end;\r\n\r\n        // calculate the arch length\r\n        if (v.start < v.end) {\r\n          v.length = v.end - v.start;\r\n        }\r\n\r\n        else {\r\n          v.length = v.start - v.end;\r\n        };\r\n\r\n        return v;\r\n      });\r\n\r\n      // Sort based on length\r\n      sortedArcs.sort(function (a, b) {\r\n        if (a.length < b.length)\r\n          return -1;\r\n        else\r\n          return 1;\r\n      });\r\n\r\n      // Add sorted arcs and anchors\r\n      this._sortedArcs    = lengthSort(sortedArcs, false);\r\n      this._sortedAnchors = lengthSort(Object.values(anchors), true);\r\n    },\r\n\r\n\r\n    /**\r\n     * Center the viewport of the canvas\r\n     * TODO:\r\n     *   This is identical to treehierarchy\r\n     */\r\n    center : function () {\r\n      if (this._el === undefined)\r\n       return;\r\n\r\n      const treeDiv = this._el.parentNode;\r\n\r\n      const cWidth = parseFloat(window.getComputedStyle(this._el).width);\r\n      const treeWidth = parseFloat(window.getComputedStyle(treeDiv).width);\r\n      // Reposition:\r\n      if (cWidth > treeWidth) {\r\n       var scrollValue = (cWidth - treeWidth) / 2;\r\n       treeDiv.scrollLeft = scrollValue;\r\n      };\r\n    },\r\n\r\n\r\n    // Show the element\r\n    show : function () {\r\n      const t = this;\r\n      const svg = this._el;\r\n      const height = this.maxArc;\r\n\r\n      // Delete old group\r\n      if (svg.getElementsByTagName(\"g\")[0] !== undefined) {\r\n        svg.removeChild(\r\n          svg.getElementsByTagName(\"g\")[0]\r\n        );\r\n        t._tokenElements = [];\r\n      };\r\n\r\n      const g = svg.appendChild(t._c(\"g\"));\r\n\r\n      // Draw token list\r\n      const text = g.appendChild(t._c(\"text\"));\r\n      text.setAttribute('class', 'leaf');\r\n      text.setAttribute(\"text-anchor\", \"start\");\r\n      text.setAttribute(\"y\", height);\r\n\r\n      // Calculate the start position\r\n      t._y = height - (t.anchorStart);\r\n\r\n      // Introduce some prepending whitespace (yeah - I know ...)\r\n      const ws = text.appendChild(t._c(\"tspan\"));\r\n      ws.appendChild(d.createTextNode('\\u00A0'));\r\n      ws.style.textAnchor = \"start\";\r\n      \r\n      t._tokens.forEach(function(node_i) {\r\n        // Append svg\r\n        // var x = text.appendChild(this._c(\"text\"));\r\n        const tspan = text.appendChild(this._c(\"tspan\"));\r\n        tspan.appendChild(d.createTextNode(node_i));\r\n        tspan.setAttribute(\"text-anchor\", \"middle\");\r\n        \r\n        this._tokenElements.push(tspan);\r\n\r\n        // Add whitespace!\r\n        tspan.setAttribute(\"dx\", this.tokenSep);\r\n      }, t);\r\n\r\n      // Get some global position data that may change on resize\r\n      t.offsetLeft = t._rect(g).left;\r\n\r\n      // The group of arcs\r\n      const arcs = g.appendChild(t._c(\"g\"));\r\n      t._arcsElement = arcs;\r\n      arcs.classList.add(\"arcs\");\r\n\r\n      const labels = g.appendChild(t._c(\"g\"));\r\n      t._labelsElement = labels;\r\n      labels.classList.add(\"labels\");\r\n\r\n      // Sort arcs if not sorted yet\r\n      if (t._sortedArcs === undefined)\r\n        t._sortArcs();\r\n\r\n      // 1. Draw all anchors\r\n      t._sortedAnchors.forEach(\r\n        i => t._drawAnchor(i)\r\n      );\r\n\r\n      // 2. Draw all arcs\r\n      t._sortedArcs.forEach(\r\n        i => t._drawArc(i)\r\n      );\r\n\r\n      // Resize the svg with some reasonable margins\r\n      svg.setAttribute(\"width\", t._rect(text).width + 20);\r\n      svg.setAttribute(\"height\", height + 20);\r\n      svg.setAttribute(\"class\", \"relTree\");\r\n    }\r\n  };\r\n\r\n  // Sort relations regarding their span\r\n  function lengthSort (list, inclusive) {\r\n\r\n    /*\r\n     * The \"inclusive\" flag allows to\r\n     * modify the behaviour for inclusivity check,\r\n     * e.g. if identical start or endpoints mean overlap or not.\r\n     */\r\n    \r\n    let stack = [];\r\n\r\n    // Iterate over all definitions\r\n    list.forEach(function(current) {\r\n\r\n      // Check the stack order\r\n      let overlaps = 0;\r\n      let check;\r\n      for (let j = (stack.length - 1); j >= 0; j--) {\r\n        check = stack[j];\r\n\r\n        // (a..(b..b)..a)\r\n        if (current.first <= check.first && current.last >= check.last) {\r\n          overlaps = check.overlaps + 1;\r\n          break;\r\n        }\r\n\r\n        // (a..(b..a)..b)\r\n        else if (current.first <= check.first && current.last >= check.first) {\r\n\r\n          if (inclusive || (current.first != check.first && current.last != check.first)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        }\r\n        \r\n        // (b..(a..b)..a)\r\n        else if (current.first <= check.last && current.last >= check.last) {\r\n\r\n          if (inclusive || (current.first != check.last && current.last != check.last)) {\r\n            overlaps = check.overlaps + (current.length == check.length ? 0 : 1);\r\n          };\r\n        };\r\n      };\r\n\r\n      // Set overlaps\r\n      current.overlaps = overlaps;\r\n\r\n      stack.push(current);\r\n\r\n      // Although it is already sorted,\r\n      // the new item has to be put at the correct place\r\n      // TODO:\r\n      //   Use something like splice() instead\r\n      stack.sort(function (a,b) {\r\n        b.overlaps - a.overlaps\r\n      });\r\n    });\r\n\r\n    return stack;\r\n  };\r\n});\r\n\n\r\n\r\ndefine('view/match/relations',[\r\n  'view',\r\n  'match/treehierarchy',\r\n  'match/treearc'\r\n], function (viewClass, matchTreeHierarchyClass, matchTreeArcClass) {\r\n\r\n  const d = document;\r\n  const loc   = KorAP.Locale;\r\n  loc.DOWNLOAD = loc.DOWNLOAD || 'Download';\r\n\r\n  \r\n  return {\r\n    create : function (match,foundry,layer,type) {\r\n      return Object.create(viewClass)\r\n        ._init(['relations'])\r\n        .upgradeTo(this)\r\n        ._init(match, foundry, layer, type);\r\n    },\r\n\r\n\r\n    // Initialize relations object\r\n    _init : function (match,foundry, layer, type) {\r\n      this._match = match;\r\n      this._foundry = foundry;\r\n      this._layer = layer;\r\n      this._type = type;\r\n      return this;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Meta view element\r\n     */\r\n    show : function () {\r\n\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const matchtree = d.createElement('div');\r\n      matchtree.classList.add('matchtree', 'loading');\r\n\r\n      // Add title line\r\n      const h6 = matchtree.addE('h6');\r\n      h6.addE('span').addT(this._foundry);\r\n      h6.addE('span').addT(this._layer);      \r\n\r\n      this._tree = matchtree.addE('div');\r\n\r\n      return this._show = matchtree;\r\n    },\r\n\r\n\r\n    /**\r\n     * Do after embedding\r\n     */\r\n    afterEmbed : function () {\r\n\r\n      const foundry = this._foundry,\r\n            layer = this._layer,\r\n            type = this._type;\r\n\r\n      const that = this,\r\n            tree = this._tree,\r\n            matchtree = this._show;\r\n\r\n      // Get tree data async\r\n      this.getData(foundry, layer, type, function (treeObj) {\r\n\r\n        matchtree.classList.remove('loading');\r\n\r\n        // Something went wrong - probably log!!!\r\n\r\n        if (treeObj === null) {\r\n          tree.addT('No data available.');\r\n        }\r\n        else {\r\n          tree.appendChild(treeObj.element());\r\n          treeObj.show();\r\n\r\n          // Reposition the view to the center\r\n          // (This may in a future release be a reposition\r\n          // to move the root to the actual match)\r\n\r\n          // This is currently not supported by relations\r\n          if (type === \"spans\") {\r\n\r\n            // Download link\r\n            that.actions.add(\r\n              loc.DOWNLOAD,\r\n              {'cls':['button-icon','download']},\r\n              function (e) {\r\n                const a = treeObj.downloadLink();\r\n                d.body.appendChild(a);\r\n                a.click();\r\n                d.body.removeChild(a)\r\n              }\r\n            );\r\n          };\r\n          \r\n          treeObj.center();\r\n        };\r\n      });\r\n\r\n      matchtree.classList.remove('loading');\r\n    },\r\n\r\n    /**\r\n     * Get match object\r\n     */\r\n    match : function () {\r\n      return this._match;\r\n    },\r\n\r\n\r\n    /**\r\n     * Retrieve and parse snippet for relation\r\n     * representation\r\n     */\r\n    getData : function (foundry, layer, type, cb) {\r\n      var focus = [];\r\n\r\n      try {\r\n        // TODO: Support and cache multiple trees\r\n        KorAP.API.getMatchInfo(\r\n          this._match, {\r\n            'spans' : true,\r\n            'foundry' : foundry,\r\n            'layer' : layer\r\n          },\r\n          function (matchResponse) {\r\n            if (matchResponse === undefined) {\r\n              cb(null);\r\n              return;\r\n            };\r\n\r\n            // Get snippet from match info\r\n            if (matchResponse[\"snippet\"] !== undefined) {\r\n\r\n              // Todo: This should be cached somehow\r\n\r\n              if (type === \"spans\") {\r\n                cb(matchTreeHierarchyClass.create(matchResponse[\"snippet\"]));\r\n              }\r\n              else if (type === \"rels\") {\r\n                cb(matchTreeArcClass.create(matchResponse[\"snippet\"]));              \r\n              }\r\n\r\n              // Unknown tree type\r\n              else {\r\n                cb(null);\r\n              };\r\n            }\r\n            else {\r\n              cb(null);\r\n            };\r\n          }.bind(this)\r\n        );\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n        cb(null);\r\n      };\r\n    },\r\n  \r\n\r\n    // Delete circular references\r\n    onClose : function () {\r\n      this._match = undefined;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The match panel.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/match',[\r\n  'panel',\r\n  'match/treeitem',\r\n  'view/match/tokentable',\r\n  'view/match/meta',\r\n  'view/match/relations',\r\n  'buttongroup/menu',\r\n], function (panelClass,treeItemClass,tableView,metaView,relationsView,buttonGroupMenuClass) {\r\n\r\n  // Override \r\n  KorAP.API.getMatchInfo = KorAP.API.getMatchInfo || function () {\r\n    KorAP.log(0, 'KorAP.API.getMatchInfo() not implemented')\r\n    return {};\r\n  };\r\n\r\n  const loc = KorAP.Locale;\r\n\r\n  loc.SHOWANNO  = loc.SHOWANNO  || 'Tokens';\r\n  loc.SHOW_META = loc.SHOW_META || 'Metadata';\r\n  loc.ADDTREE   = loc.ADDTREE   || 'Relations';\r\n\r\n  return {\r\n    create : function (match) {\r\n      return Object.create(panelClass)._init(['matchinfo']).upgradeTo(this)._init(match);\r\n    },\r\n\r\n    // Initialize match panel\r\n    _init : function (match) {\r\n\r\n      this._match = match;\r\n\r\n      const a = this.actions;\r\n\r\n      // TODO:\r\n      //   Ugly hack!\r\n      const cl = a.element().classList;\r\n      cl.remove('matchinfo');\r\n      cl.add('button-matchinfo');\r\n\r\n      // Add meta button\r\n      a.add(\r\n        loc.SHOW_META, {'cls':['metatable']}, function (e) {\r\n          this.addMeta();\r\n        }\r\n      );\r\n\r\n      // Add token annotation button\r\n      a.add(\r\n        loc.SHOWANNO, {'cls':['info']}, function (e) {\r\n          this.addTable();\r\n        }\r\n      );\r\n\r\n      // Add relations button\r\n      a.add(\r\n        loc.ADDTREE, {'cls':['tree']}, function (e) {\r\n\r\n          // Get global tree menu\r\n          if (KorAP.TreeMenu === undefined) {\r\n            KorAP.TreeMenu = buttonGroupMenuClass.create([], treeItemClass);\r\n            KorAP.TreeMenu.element().setAttribute('id', 'treeMenu');\r\n          };\r\n\r\n          const tm = KorAP.TreeMenu;\r\n\r\n          // Set panel\r\n          tm.panel(this);\r\n\r\n          // Reread list\r\n          tm.readItems(this._treeMenuList());\r\n\r\n          // Reposition and show menu\r\n          tm.show();\r\n          tm.button(this.button);\r\n          tm.focus();\r\n        }\r\n      );\r\n\r\n      // If plugins are enabled, add all buttons for the match panel\r\n      if (KorAP.Plugin) {\r\n        const matchButtons = KorAP.Plugin.buttonGroup(\"match\");\r\n        if (matchButtons) {\r\n\r\n          // Add all matchbuttons in order\r\n          matchButtons.forEach(m => a.add.apply(a, m));\r\n        };\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add meta view to panel\r\n     */\r\n    addMeta : function () {\r\n      const t = this;\r\n      if (t._metaView && t._metaView.shown())\r\n        return;\r\n\r\n      t._metaView = metaView.create(t._match);\r\n      t.add(t._metaView);\r\n    },\r\n\r\n    \r\n    /**\r\n     * Add table view to panel\r\n     */\r\n    addTable : function () {\r\n      const t = this;\r\n      if (t._tableView && t._tableView.shown())\r\n        return;\r\n      t._tableView = tableView.create(t._match);\r\n      t.add(t._tableView);\r\n    },\r\n\r\n\r\n    /**\r\n     * Add Tree view to panel\r\n     */\r\n    addTree : function (foundry, layer, type) {\r\n      this.add(\r\n        relationsView.create(this._match, foundry, layer, type)\r\n      );\r\n      \r\n    },\r\n\r\n\r\n    // Return tree menu list\r\n    _treeMenuList : function () {\r\n     \r\n      if (this._menuList)\r\n        return this._menuList;\r\n\r\n      // Join spans and relations\r\n      let treeLayers = []\r\n\r\n      const match = this._match;\r\n      match.getSpans().forEach(i => treeLayers.push(i));\r\n      match.getRels().forEach(i => treeLayers.push(i));\r\n\r\n      // Get spans\r\n      treeLayers = treeLayers.sort(\r\n        function (a, b) {\r\n          if (a.foundry < b.foundry) {\r\n            return -1;\r\n          }\r\n          else if (a.foundry > b.foundry) {\r\n            return 1;\r\n          }\r\n          else if (a.layer < b.layer) {\r\n            return -1;\r\n          }\r\n          else if (a.layer > b.layer) {\r\n            return 1;\r\n          };\r\n          return 0;\r\n        });\r\n      \r\n      let menuList = [];\r\n      \r\n      // Show tree views\r\n      treeLayers.forEach(\r\n        s => \r\n          // Add foundry/layer to menu list\r\n          menuList.push([\r\n            s.foundry + '/' + s.layer,\r\n            s.foundry,\r\n            s.layer,\r\n            s.type\r\n          ]));\r\n\r\n      // Create tree menu\r\n      this._menuList = menuList;\r\n      return menuList;\r\n    }   \r\n  }\r\n});\r\n\n/**\r\n * Get information on matches,\r\n * generate annotation tables and trees.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * - Highlight (at least mark as bold) the match\r\n * - Scroll to match vertically per default\r\n * - A click on a table field and a tree node should at the field description to the fragments list.\r\n */\r\n\r\n\r\ndefine('match',[\r\n  'buttongroup',\r\n  'panel/match',\r\n\t'util'\r\n], function (buttonGroupClass,matchPanelClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.MINIMIZE     = loc.MINIMIZE  || 'Minimize';\r\n  \r\n  // 'corpusID', 'docID', 'textID'\r\n  const _matchTerms  = ['textSigle', 'matchID', 'available'];\r\n\r\n  const d = document;\r\n\r\n  /**\r\n   * Match object\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create a new match object.\r\n     * Expects an element with match descriptions.\r\n     */\r\n    create : function (match) {\r\n      return Object.create(this)._init(match);\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize match.\r\n     */\r\n    _init : function (match) {\r\n      const t= this;\r\n      t._el = null;\r\n      t._initialized = false;\r\n\r\n      // No match defined\r\n      if (arguments.length < 1 ||\r\n          match === null ||\r\n          match === undefined) {\r\n        throw new Error('Missing parameters');\r\n      }\r\n\r\n      // Match defined as a node\r\n      else if (match instanceof Node) {\r\n        t._el  = match;\r\n\r\n        // Circular reference !!\r\n        match[\"_match\"] = t;\r\n\r\n        if (match.hasAttribute('data-text-sigle')) {\r\n          t.textSigle = match.getAttribute('data-text-sigle')\r\n        }\r\n        else {\r\n          t.textSigle = match.getAttribute('data-corpus-id') +\r\n            '/' +\r\n            match.getAttribute('data-doc-id') +\r\n            '/' +\r\n            match.getAttribute('data-text-id');\r\n        };\r\n\r\n        t.matchID   = match.getAttribute('data-match-id');\r\n        \r\n        // List of available annotations\r\n        t.available = match.getAttribute('data-available-info').split(' ');\r\n      }\r\n\r\n      // Match as an object\r\n      else {\r\n\r\n        // Iterate over allowed match terms\r\n        _matchTerms.forEach(function(term) {\r\n          this[term] = match[term] !== undefined ? match[term] : undefined;\r\n        }, t);\r\n      };\r\n      \r\n      t._avail = {\r\n        tokens : [],\r\n        spans  : [],\r\n        rels   : []\r\n      };\r\n\r\n      // Iterate over info layers\r\n      let layer;\r\n      t.available.forEach(function(term){\r\n\r\n        // Create info layer objects\r\n        try {\r\n          layer = require('match/infolayer').create(term);\r\n          this._avail[layer.type].push(layer);\r\n        }\r\n        catch (e) {\r\n          return;\r\n        };\r\n      }, t);\r\n      \r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Return a list of parseable tree annotations.\r\n     */\r\n    getSpans : function () {\r\n      return this._avail.spans;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable token annotations.\r\n     */\r\n    getTokens : function () {\r\n      return this._avail.tokens;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return a list of parseable relation annotations.\r\n     */\r\n    getRels : function () {\r\n      return this._avail.rels;\r\n    },\r\n\r\n    /**\r\n     * Initialize match\r\n     */\r\n    init : function () {\r\n      const t = this;\r\n      if (t._initialized)\r\n        return t;\r\n\r\n      // Add actions unless it's already activated\r\n      const element = t._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return undefined;\r\n      \r\n      // Add meta button\r\n      const refLine = element.querySelector(\"p.ref\");\r\n\r\n      // No reference found\r\n      if (!refLine)\r\n        return undefined;\r\n\r\n      // Create panel\r\n      t.panel = matchPanelClass.create(t);\r\n\r\n      t._el.insertBefore(\r\n        t.panel.element(),\r\n        t._el.querySelector(\"p.ref\")\r\n      );\r\n\r\n      // Insert before reference line\r\n      refLine.insertBefore(\r\n        t.panel.actions.element(),\r\n        refLine.firstChild\r\n      );\r\n\r\n      t._initialized = true;\r\n      return t;\r\n    },\r\n\r\n    /**\r\n     * Open match\r\n     */\r\n    open : function () {\r\n      \r\n      // Add actions unless it's already activated\r\n      const element = this._el;\r\n\r\n      // There is an element to open\r\n      if (element === undefined || element === null)\r\n        return false;\r\n\r\n      // The element is already opened\r\n      if (element.classList.contains('active'))\r\n        return false;\r\n      \r\n      // Add active class to element\r\n      element.classList.add('active');\r\n\r\n      const btn = buttonGroupClass.create(\r\n        ['action','button-view']\r\n      );\r\n\r\n      const that = this;\r\n      btn.add(loc.MINIMIZE, {'cls':['button-icon','minimize']}, function () {\r\n        that.minimize();\r\n      });\r\n      element.appendChild(btn.element());\r\n      \r\n      if (this.init() == undefined) {\r\n        return false;\r\n      };\r\n      \r\n      return true;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Toggle match view\r\n     */\r\n    toggle : function () {\r\n      if (this._el.classList.contains('active'))\r\n        this.minimize();\r\n      else\r\n        this.open();\r\n    },\r\n\r\n\r\n    /**\r\n     * Minimize info view\r\n     */\r\n    minimize : function () {\r\n      this._el.classList.remove('active');\r\n    },\r\n\r\n    \r\n    /**\r\n     * Get match element.\r\n     */\r\n    element : function () {\r\n      return this._el; // May be null\r\n    }\r\n  };\r\n});\r\n\n// Input field for queries\r\n/*\r\n * TODO: Support alert for query problems.\r\n */\r\n\r\n\r\n\r\ndefine('hint/input',['util'], function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create a new input field.\r\n     */\r\n    create : function (element) {\r\n      return Object.create(this)._init(element);\r\n    },\r\n\r\n\r\n    // Initialize new input field\r\n    _init : function (element) {\r\n      this._el = element;\r\n\r\n      this._container = document.createElement(\"div\");\r\n      this._container.setAttribute('id', 'hint');\r\n\r\n      // Create mirror for searchField\r\n      // This is important for positioning\r\n      // if ((this._mirror = document.getElementById(\"searchMirror\")) === null) {\r\n      this._mirror = document.createElement(\"div\");\r\n      const m = this._mirror;\r\n      m.classList.add('hint', 'mirror');\r\n      m.addE(\"span\");\r\n      m.appendChild(this._container);\r\n      m.style.height = \"0px\";\r\n      document.getElementsByTagName(\"body\")[0].appendChild(m);\r\n\r\n      // Update position of the mirror\r\n      const re = this.reposition.bind(this);\r\n      window.addEventListener('resize', re);\r\n      this._el.addEventListener('onfocus', re);\r\n      this.reposition();\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the mirrored input field.\r\n     */\r\n    mirror : function () {\r\n      return this._mirror;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the container element.\r\n     * This contains the hint helper / menus\r\n     * and probably an\r\n     * error message.\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the input element the\r\n     * hint helper is attached to.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field\r\n     * the hint helper is attached to.\r\n     */\r\n    value : function () {\r\n      return this._el.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the value of the input field mirror.\r\n     */\r\n    mirrorValue : function () {\r\n      return this._mirror.firstChild.textContent;\r\n    },\r\n\r\n\r\n    /**\r\n     * Reset the input value\r\n     */\r\n    reset : function () {\r\n      this._el.value = \"\";\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the mirror content.\r\n     */\r\n    update : function () {\r\n      this._mirror.firstChild.textContent = this._split()[0];\r\n      this._container.style.left = this._rightPos() + 'px';\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Insert text into the mirror.\r\n     * This is a prefix of the input field's\r\n     * value.\r\n     */\r\n    insert : function (text) {\r\n      const splittedText = this._split();\r\n      const s = this._el;\r\n      s.value = splittedText[0] + text + splittedText[1];\r\n      s.selectionStart = (splittedText[0] + text).length;\r\n      s.selectionEnd = s.selectionStart;\r\n\r\n      // Maybe update?\r\n      this._mirror.firstChild.textContent = splittedText[0] + text;\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Move hinthelper to given character position\r\n     */\r\n    moveto : function (charpos) {\r\n      const e = this._el;\r\n      e.selectionStart = charpos;\r\n      e.selectionEnd = charpos;\r\n      e.focus();\r\n      return this.update();\r\n    },\r\n\r\n\r\n    /**\r\n     * Reposition the input mirror directly\r\n     * below the input box.\r\n     */\r\n    reposition : function () {\r\n      const inputClientRect = this._el.getBoundingClientRect();\r\n      const inputStyle = window.getComputedStyle(this._el, null);\r\n\r\n      const bodyClientRect = \r\n            document.getElementsByTagName('body')[0].getBoundingClientRect();\r\n\r\n      // Reset position\r\n      const mirrorStyle = this._mirror.style;\r\n      mirrorStyle.left  = parseInt(inputClientRect.left) + \"px\";\r\n      mirrorStyle.top   = parseInt(inputClientRect.bottom - bodyClientRect.top) + \"px\";\r\n      mirrorStyle.width = inputStyle.getPropertyValue(\"width\");\r\n\r\n      // These may be relevant in case of media depending css\r\n      mirrorStyle.paddingLeft     = inputStyle.getPropertyValue(\"padding-left\");\r\n      mirrorStyle.marginLeft      = inputStyle.getPropertyValue(\"margin-left\");\r\n      mirrorStyle.borderLeftWidth = inputStyle.getPropertyValue(\"border-left-width\");\r\n      mirrorStyle.borderLeftStyle = inputStyle.getPropertyValue(\"border-left-style\");\r\n      mirrorStyle.fontSize        = inputStyle.getPropertyValue(\"font-size\");\r\n      mirrorStyle.fontFamily      = inputStyle.getPropertyValue(\"font-family\");\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the context, which is the input\r\n     * field's value bounded to the\r\n     * cursor position.\r\n     */\r\n    context : function () {\r\n      return this._split()[0];\r\n    },\r\n\r\n\r\n    // Get the right position\r\n    _rightPos : function () {\r\n      const box = this._mirror.firstChild.getBoundingClientRect();\r\n      return box.right - box.left;\r\n    },\r\n\r\n\r\n    /*\r\n     * Return two substrings,\r\n     * splitted at a given position\r\n     * or at the current cursor position.\r\n     */\r\n    _split : function (start) {\r\n      const s = this._el;\r\n      const value = s.value;\r\n\r\n      // Get start from cursor position\r\n      if (arguments.length === 0)\r\n        start = s.selectionStart;\r\n\r\n      return new Array(\r\n        value.substring(0, start),\r\n        value.substring(start, value.length)\r\n      );\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu item based on MenuItem\r\n */\r\n\r\n\r\ndefine('hint/item',['menu/item', 'util'], function (itemClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item object.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)\r\n\t      ._init(params);\r\n    },\r\n\r\n    // Initialize menu item object\r\n    _init : function (params) {\r\n      if (params[0] === undefined ||\r\n\t        params[1] === undefined)\r\n\t      throw new Error(\"Missing parameters\");\r\n      \r\n      this._name   = params[0];\r\n      this._action = params[1];\r\n      this._lcField = ' ' + this._name.toLowerCase();\r\n      \r\n      if (params.length > 2) {\r\n\t      this._desc = params[2];\r\n\t      this._lcField += \" \" + this._desc.toLowerCase();\r\n      };\r\n\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Get or set the content of the item.\r\n     */\r\n    content : function (content) {\r\n      if (arguments.length === 1) {\r\n\t      this._content = content;\r\n      };\r\n      return this._content;\r\n    },\r\n  \r\n    /**\r\n     * Override the click action\r\n     * of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var m = this.menu();\r\n      // m.hide();\r\n\r\n      // Reset prefix\r\n      m.prefix(\"\");\r\n\r\n      var h = m.hint();\r\n\r\n      // Update input field\r\n      var input = h.inputField();\r\n      input.insert(this._action).update();\r\n\r\n      e.halt();\r\n     \r\n      // show alt\r\n      h.show(true);\r\n    },\r\n\r\n    /**\r\n     * The name of the menu entry.\r\n     */\r\n    name : function () {\r\n      return this._name;\r\n    },\r\n\r\n    /**\r\n     * The action (the string inserted on click)\r\n     * of the menu item.\r\n     */\r\n    action : function () {\r\n      return this._action;\r\n    },\r\n\r\n    /**\r\n     * The description of the menu item.\r\n     */\r\n    desc : function () {\r\n      return this._desc;\r\n    },\r\n\r\n    /**\r\n     * The associated dom element of the\r\n     * menu item.\r\n     */\r\n    element : function () {\r\n      // already defined\r\n      if (this._el !== undefined)\r\n\t      return this._el;\r\n\r\n      // Create list item\r\n      var li = document.createElement(\"li\");\r\n\r\n      if (this.onclick !== undefined) {\r\n\t      li[\"onclick\"] = this.onclick.bind(this);\r\n      };\r\n\r\n      // Create title\r\n      var name =  document.createElement(\"span\");\r\n      name.addT(this._name);\r\n      \r\n      li.appendChild(name);\r\n\r\n      // Create description\r\n      if (this._desc !== undefined) {\r\n\t      var desc = document.createElement(\"span\");\r\n\t      desc.classList.add('desc');\r\n\t      desc.addT(this._desc);\r\n\t      li.appendChild(desc);\r\n      };\r\n      return this._el = li;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/prefix',['menu/prefix'], function (prefixClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create prefix object for the hint helper menu.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(prefixClass).\r\n\t      upgradeTo(this)._init(params);\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    onclick : function (e) {\r\n      const m = this.menu();\r\n      const value = this.value();\r\n      const h = m.hint();\r\n      h.inputField().insert(value);\r\n      h.active(null);\r\n      m.hide();\r\n      // h.unshow();\r\n      e.halt();\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('hint/lengthField',['menu/lengthField', 'util'], function (lengthFieldClass) {\r\n  return {\r\n\r\n    /**\r\n     * Create lengthField object for the hint helper menu.\r\n     */\r\n    create : function () {\r\n      return Object.create(lengthFieldClass).\r\n\t      upgradeTo(this)._init();\r\n    },\r\n\r\n    /**\r\n     * Override the prefix action.\r\n     */\r\n    add : function (param) {\r\n      this._el.addE('span').addT(param[0] + '--');\r\n\r\n      var desc = this._el.addE('span');\r\n      desc.classList.add(\"desc\");\r\n      desc.addT(param[2] + '--');\r\n      this._el.appendChild(desc);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Hint menu\r\n */\r\n\r\n\r\n\r\ndefine('hint/menu',[\r\n  'menu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  menuClass,\r\n  itemClass,\r\n  prefixClass,\r\n  lengthFieldClass) {\r\n\r\n  return {\r\n    \r\n    /**\r\n     * Create new hint helper menu.\r\n     */\r\n    create : function (hint, context, params) {\r\n      const obj = Object.create(menuClass)\r\n\t        .upgradeTo(this)\r\n\t        ._init(params, {\r\n\t          itemClass : itemClass,\r\n\t          prefixClass : prefixClass,\r\n\t          lengthFieldClass : lengthFieldClass\r\n\t        });\r\n      obj._context = context;\r\n      obj._el.classList.add('hint');\r\n      obj._hint = hint;\r\n\r\n      // Make the top item always active\r\n      obj._firstActive = true;\r\n\r\n      obj.element().addEventListener('blur', function (e) {\r\n        this.menu.hide(); // WithoutDestruction();\r\n      });\r\n\r\n      // Focus on input field on hide\r\n      obj.onHide = function () {\r\n        const h = this._hint;\r\n        h._inputField.element().focus();\r\n        if (h.active() !== null) {\r\n          if (h._alert.active) {\r\n            h._unshowAlert();\r\n          };\r\n          h.active(null);\r\n        };\r\n      };\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * The hint helper object,\r\n     * the menu is attached to.\r\n     */ \r\n    hint : function () {\r\n      return this._hint;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Regex object for checking the context of the hint\r\n */\r\n\r\n\r\ndefine('hint/contextanalyzer',{\r\n\r\n  /**\r\n   * Create analyzer based on regular expression.\r\n   */\r\n  create : function (regex) {\r\n    return Object.create(this)._init(regex);\r\n  },\r\n\r\n  // Initialize analyzer\r\n  _init : function (regex) {\r\n    try {\r\n      this._regex = new RegExp(regex);\r\n    }\r\n    catch (e) {\r\n      KorAP.log(0, e);\r\n      return;\r\n    };\r\n    return this;\r\n  },\r\n\r\n  /**\r\n   * Check a context based on the analyzer\r\n   * and return a valid context string.\r\n   */\r\n  test : function (text) {\r\n    if (!this._regex.exec(text))\r\n      return;\r\n    return RegExp.$1;\r\n  }\r\n});\r\n\n/**\r\n * Hint menu alert, positioned at the exact char.\r\n */\r\n\r\n\r\ndefine('hint/alert',[],function () {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Construct a new alert object\r\n     */\r\n    create : function (msg) {\r\n      return Object.create(this)._init(msg);\r\n    },\r\n\r\n    // Init\r\n    _init : function (msg) {\r\n      const t = this;\r\n      t._type = 'alert';\r\n      t.active = false;\r\n      t._el = document.createElement('div');\r\n      t._el.style.display = 'none';\r\n      t._el.classList.add('alert', 'hint');\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show alert.\r\n     */\r\n    show : function (msg) {\r\n      this.active = true;\r\n      const e = this._el;\r\n      e.textContent = msg;\r\n      e.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Hide alert.\r\n     */\r\n    hide : function () {\r\n      if (!this.active)\r\n\t      return false;\r\n      this._el.style.display = 'none';\r\n      this.active = false;\r\n      return true;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get alert object.\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Hint menu for Kalamar.\r\n * Based on menu object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO: Check for cnx/syn=\r\n * TODO: List can be shown when prefix is like 'base/s=pcorenlp/'\r\n * TODO: Sometimes the drop-down box down vanish when list is shown\r\n * TODO: Create should expect an input text field\r\n * TODO: Embed only one single menu (not multiple)\r\n *       By holding the current menu in _active\r\n * TODO: show() should accept a context field (especially for no-context fields,\r\n *       like fragments)\r\n * TODO: Improve context analyzer from hint!\r\n * TODO: Marked annotations should be addable to \"fragments\"\r\n */\r\n\r\n\r\n\r\ndefine('hint',[\r\n  'hint/input',\r\n  'hint/menu',\r\n  'hint/contextanalyzer',\r\n  'hint/alert',\r\n  'util'\r\n], function (inputClass, \r\n             menuClass,\r\n             analyzerClass,\r\n             alertClass) {\r\n\r\n  // Initialize hint array\r\n\r\n  /**\r\n   * KorAP.Hint.create({\r\n   *   inputField : node,\r\n   *   context : context regex\r\n   * });\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new hint helper.\r\n     */\r\n    create : function (param) {\r\n      return Object.create(this)._init(param);\r\n    },\r\n\r\n\r\n    // Initialize hint helper\r\n    _init : function (param) {\r\n      param = param || {};\r\n\r\n      // Holds all menus per prefix context\r\n      this._menu   = {};\r\n      this._alert  = alertClass.create();\r\n\r\n      // Active may either hold an alert or a menu\r\n      this._active = null;\r\n\r\n      // No annotation helper available\r\n      if (!KorAP.annotationHelper) {\r\n        console.log(\"No annotationhelper defined\");\r\n        return;\r\n      };\r\n      \r\n      /**\r\n       * @define {regex} Regular expression for context\r\n       */\r\n      KorAP.context = KorAP.context ||\r\n        \"(?:^|[^-_a-zA-Z0-9])\" +   // Anchor\r\n        \"((?:[-_a-zA-Z0-9]+?)\\/\" + // Foundry\r\n        \"(?:\" +\r\n        \"(?:[-_a-zA-Z0-9]+?)=\" +   // Layer\r\n        \"(?:\"+\r\n        \"(?:[^:=\\/ ]+?):|\" +       // Key\r\n        \"(?:[^-=\\/ ]+?)-\" +        // Node\r\n        \")?\" +\r\n        \")?\" +\r\n        \")$\";\r\n\r\n      // Get input field\r\n      const qfield = param[\"inputField\"] || document.getElementById(\"q-field\");\r\n      if (!qfield)\r\n        return null;\r\n\r\n      // Create input field\r\n      this._inputField = inputClass.create(qfield);\r\n\r\n      // create alert\r\n      const that = this;\r\n\r\n      const c = this._inputField.container();\r\n      c.appendChild(this._alert.element());\r\n      c.addEventListener('click', function (e) {\r\n        if (!this.classList.contains('active')) {\r\n          that.show(false);\r\n        };\r\n      });\r\n\r\n      // Move infobox\r\n      const inputFieldElement = this._inputField.element();\r\n      inputFieldElement.addEventListener(\"keyup\", this.update.bind(this));\r\n      inputFieldElement.addEventListener(\"click\", this.update.bind(this));\r\n\r\n      // Add event listener for key pressed down\r\n      let _down = function (e) {\r\n        if (_codeFromEvent(e) === 40) {\r\n          this.show(false);\r\n          e.halt();\r\n        };\r\n      };\r\n\r\n      inputFieldElement.addEventListener(\r\n        \"keydown\", _down.bind(this), false\r\n      );\r\n\r\n      // Add touch events\r\n      inputFieldElement.addEventListener(\r\n        'touchstart',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchend',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n      inputFieldElement.addEventListener(\r\n        'touchmove',\r\n        this._touch.bind(this),\r\n        false\r\n      );\r\n\r\n      // Set Analyzer for context\r\n      this._analyzer = analyzerClass.create(\r\n        param[\"context\"] || KorAP.context\r\n      );\r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the input field attached to the hint helper.\r\n     */\r\n    inputField : function () {\r\n      return this._inputField;\r\n    },\r\n\r\n\r\n    /**\r\n     * Altert at a specific character position.\r\n     */\r\n    alert : function (charPos, msg) {\r\n      const t = this;\r\n      if (arguments.length === 0)\r\n        return t._alert;\r\n\r\n      // Do not alert if already alerted!\r\n      if (t._alert.active)\r\n        return false;\r\n\r\n      // Move to the correct position\r\n      t._inputField.moveto(charPos);\r\n\r\n      // Set container to active (aka hide the hint helper button)\r\n\r\n      t._alert.show(msg);\r\n      t.active(t._alert);\r\n      return true;\r\n    },\r\n    \r\n\r\n    /**\r\n     * Update input field.\r\n     */\r\n    update : function () {\r\n      this._inputField.update();\r\n      if (this._alert.hide())\r\n        this.active(null);\r\n    },\r\n\r\n\r\n    /**\r\n     * Return hint menu and probably init based on an action\r\n     */\r\n    menu : function (action) {\r\n      if (this._menu[action] === undefined) {\r\n        \r\n        // No matching hint menu\r\n        if (KorAP.annotationHelper[action] === undefined)\r\n          return;\r\n\r\n        // Create matching hint menu\r\n        this._menu[action] = menuClass.create(\r\n          this, action, KorAP.annotationHelper[action]\r\n        );\r\n      };\r\n\r\n      // Return matching hint menu\r\n      return this._menu[action];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the correct menu based on the context\r\n     */\r\n    contextMenu : function (ifContext) {\r\n      const noC = ifContext ? undefined : this.menu(\"-\");\r\n      \r\n      // Get context (aka left text)\r\n      let context = this._inputField.context();\r\n\r\n      if (context === undefined || context.length === 0) {\r\n        return noC;\r\n      };\r\n\r\n      // Get context (aka left text matching regex)\r\n      context = this._analyzer.test(context);\r\n\r\n      if (context === undefined || context.length == 0) {\r\n        return noC;\r\n      };\r\n\r\n      return this.menu(context) || noC;\r\n    },\r\n\r\n\r\n    /**\r\n     * Activate a certain menu.\r\n     * If a menu is passed, the menu will be activated.\r\n     * If null is passed, the active menu will be deactivated.\r\n     * If nothing is passed, returns the active menu.\r\n     */\r\n    active : function (obj) {\r\n      \r\n      // A menu or null was passed\r\n      if (arguments.length === 1) {        \r\n        const c = this._inputField.container();\r\n       \r\n        // Make the menu active\r\n        if (obj !== null) {\r\n          c.classList.add('active');\r\n          this._active = obj;\r\n        }\r\n\r\n        // Make the menu inactive\r\n        else {\r\n          c.classList.remove('active');\r\n          this._active = null;\r\n        }\r\n      };\r\n\r\n      // Return\r\n      return this._active;\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the menu.\r\n     * Remove all old menus.\r\n     *\r\n     * @param {boolean} Boolean value to indicate if context\r\n     *        is necessary (true) or if the main context should\r\n     *        be shown if context fails.\r\n     *        \r\n     */\r\n    show : function (ifContext) {\r\n\r\n      // Remove the active object\r\n      this._unshow();\r\n      \r\n      // Get the menu\r\n      let menu;\r\n      if (menu = this.contextMenu(ifContext)) {\r\n\r\n        this.active(menu);\r\n\r\n        let e = menu.element();\r\n        // console.log(\"Chrome may send a blur on the old menu here\");\r\n        this._active.element().blur();\r\n        this._inputField.container().appendChild(e);\r\n\r\n        menu.show();\r\n        menu.focus();\r\n        // Focus on input field\r\n        // this.inputField.element.focus();\r\n      }\r\n\r\n      else {\r\n        this._inputField.element().focus();\r\n      };\r\n    },\r\n    \r\n\r\n    // This will get the context of the field\r\n    getContext : function () {},\r\n\r\n\r\n    /**\r\n     * Deactivate the current menu and focus on the input field.\r\n     */\r\n    unshow : function () {\r\n      this._unshow();\r\n      this._inputField.element().focus();\r\n    },\r\n\r\n\r\n    // Catch touch events\r\n    _touch : function (e) {\r\n      if (e.type === 'touchstart') {\r\n        this._lastTouch = e.touches[0].clientY;\r\n      }\r\n\r\n      else if (e.type === 'touchend') {\r\n        this._lastTouch = undefined;\r\n      }\r\n      \r\n      else if (e.type == 'touchmove') {\r\n        if ((this._lastTouch + 10) < e.touches[0].clientY) {\r\n          this.show();\r\n          this._lastTouch = undefined;\r\n        };\r\n        e.halt();\r\n      }\r\n    },\r\n\r\n\r\n    // Unshow the hint menu\r\n    _unshow : function () {\r\n      if (this.active() !== null) {\r\n       \r\n        // This does not work for alert currently!\r\n        if (!this._alert.active) {\r\n\r\n          // TODO: This does not work for webkit?\r\n          this._inputField\r\n            .container()\r\n            .removeChild(this._active.element());\r\n        }\r\n\r\n        else {\r\n          this._unshowAlert();\r\n        };\r\n        \r\n        this.active(null);\r\n      };\r\n    },\r\n\r\n    // Unshow alert\r\n    _unshowAlert : function () {\r\n      this._alert.hide();\r\n      this.active(null);\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Simple cookie based session library that stores\r\n * values in JSON encoded cookies.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\n\r\ndefine('session',{\r\n  /**\r\n   * Create a new session.\r\n   * Expects a name or defaults to 'korap'\r\n   */\r\n  create : function (name = 'korap') {\r\n    const obj = Object.create(this);\r\n    obj._name = name.toLowerCase();\r\n    obj._hash = {};\r\n    obj._parse();\r\n    return obj;\r\n  },\r\n\r\n\r\n  /**\r\n   * Get a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  get : function (key) {\r\n    return this._hash[key.toLowerCase()];\r\n  },\r\n\r\n\r\n  /**\r\n   * Set a value based on a key.\r\n   * The value can be complex, as the value is stored as JSON.\r\n   */\r\n  set : function (key, value) {\r\n    this._hash[key] = value;\r\n    this._store();\r\n  },\r\n\r\n\r\n  /**\r\n   * Clears the session by removing the cookie\r\n   */\r\n  clear : function () {\r\n    this._hash = {};\r\n    document.cookie = this._name + '=; expires=-1';\r\n  },\r\n\r\n\r\n  /* Store cookie */\r\n  _store : function () {\r\n    document.cookie = this.toString();\r\n  },\r\n\r\n\r\n  /**\r\n   * Stringify session cookie.\r\n   */\r\n  toString : function () {\r\n    /*\r\n      var date = new Date();\r\n      date.setYear(date.getFullYear() + 1);\r\n    */\r\n    return this._name + '=' + encodeURIComponent(JSON.stringify(this._hash)) + ';SameSite=Lax';\r\n  },\r\n\r\n\r\n  /**\r\n   * Parse cookie\r\n   */\r\n  _parse : function () {\r\n    document.cookie.split(';').forEach(\r\n      function (i) {\r\n        const pair = i.split('=');\r\n        const name = pair[0].trim().toLowerCase();\r\n        if (name === this._name) {\r\n\t        if (pair.length === 1 || pair[1].length === 0)\r\n\t          return;\r\n          this._hash = JSON.parse(decodeURIComponent(pair[1]));\r\n\t        return;\r\n        };\r\n      },\r\n      this);\r\n  }\r\n});\r\n\n/**\r\n * Open and close a tutorial page.\r\n * The current page is stored and retrieved in a session cookie.\r\n */\r\n// TODO: Make this a panel\r\n// TODO: Add query mechanism!\r\n// TODO: Highlight current section:\r\n//       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page\r\n\r\n\r\ndefine('tutorial',['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {\r\n\r\n  // Localization values\r\n  const loc   = KorAP.Locale;\r\n  loc.CLOSE = loc.CLOSE || 'Close';\r\n\r\n  const d = document;\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Create new tutorial object.\r\n     * Accepts an element to bind the tutorial window to.\r\n     */\r\n    create : function (obj,session) {\r\n      if (!obj)\r\n\t      return null;\r\n      return Object.create(this)._init(obj,session);\r\n    },\r\n\r\n\r\n    // Initialize Tutorial object\r\n    _init : function (obj, session) {\r\n      const t = this;\r\n\r\n      if (session === undefined) {\r\n\t      t._session = sessionClass.create();\r\n      }\r\n      else {\r\n\t      t._session = session;\r\n      };\r\n    \r\n      if (obj) {\r\n\t      t._show = obj;\r\n\t      t.start = obj.getAttribute('href');\r\n\r\n        // Unknown which tutorial to show\r\n        if (!t.start)\r\n          return null;\r\n        \r\n\t      obj.removeAttribute('href');\r\n\r\n\t      obj.onclick = function () {\r\n\t        this.show();\r\n\t      }.bind(t);\r\n\r\n\t      // Injects a tutorial div to the body\r\n\t      const div = d.createElement('div');\r\n\t      div.setAttribute('id', 'tutorial');\r\n\t      div.style.display = 'none';\r\n\t      d.getElementsByTagName('body')[0].appendChild(div);\r\n\r\n\t      t._iframe = null;\r\n\t      t._el = div;\r\n\r\n\t      // Some fields\r\n\t      t._ql     = d.getElementById(\"ql-field\");\r\n\t      t._q      = d.getElementById(\"q-field\")\r\n\t      t._cutoff = d.getElementById(\"q-cutoff-field\");\r\n      };\r\n\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Initialize a search with a defined query.\r\n     */\r\n    useQuery : function (e) {\r\n      const t = this;\r\n      const q  = e.getAttribute(\"data-query\"),\r\n            ql = e.getAttribute(\"data-query-language\"),\r\n            qc = e.getAttribute(\"data-query-cutoff\");\r\n\r\n      if (qc !== 0 && qc !== \"0\" && qc !== \"off\" && qc !== null) {\r\n        if (t._cuttoff)\r\n\t        t._cutoff.checked = true;\r\n      };\r\n\r\n      if (KorAP.QLmenu) {\r\n        KorAP.QLmenu.selectValue(ql);\r\n      }\r\n\r\n      else if (t._ql) {\r\n        let found = Array.from(t._ql.options).find(o => o.value === ql);\r\n        if (found)\r\n          found.selected = true;\r\n      };\r\n\r\n      if (t._q)\r\n        t._q.value = q;\r\n\r\n      t.setPage(e);\r\n      t.hide();\r\n    },\r\n\r\n\r\n    /**\r\n     * Decorate a page with query event handler.\r\n     */\r\n    initQueries : function (d) {\r\n      Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(\r\n        i =>\r\n\t        i.onclick = function (e) {\r\n\t          this.useQuery(this,e);\r\n\t        }.bind(this)\r\n      );\r\n    },\r\n\r\n    /**\r\n     * Decorate a page with documentation links\r\n     */\r\n    initDocLinks : function (d) {\r\n      const that = this;\r\n      Array.from(d.getElementsByClassName('doc-link')).forEach(\r\n\t      i =>\r\n          i.onclick = function () {\r\n\t          that.setPage(this.getAttribute('href'));\r\n\t          return true;\r\n\t        }\r\n      );\r\n    },\r\n\r\n\r\n    /**\r\n     * Show the tutorial page embedded.\r\n     */\r\n    show : function () {\r\n      const t = this;\r\n      const element = t._el;\r\n      if (element.style.display === 'block')\r\n\t      return;\r\n\r\n      if (t._iframe === null) {\r\n\t      t._iframe = d.createElement('iframe');\r\n\t      t._iframe.setAttribute(\r\n\t        'src',\r\n\t        (t.getPage() || t.start) + '?embedded=true'\r\n\t      );\r\n\r\n        const btn = buttonGroupClass.create(\r\n          ['action','button-view']\r\n        );\r\n\r\n        btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {\r\n          element.style.display = 'none';\r\n        });\r\n\r\n        element.appendChild(btn.element());\r\n\r\n\t      // Add open in new window button\r\n\t      // Add scroll to top button\r\n\t      /*\r\n\t        var info = document.createElement('li');\r\n\t        info.appendChild(document.createElement('span'))\r\n\t        .appendChild(document.createTextNode(loc.SHOWINFO));\r\n\t        info.classList.add('info');\r\n\t        info.setAttribute('title', loc.SHOWINFO);\r\n\r\n\t        ul.appendChild(close);\r\n\t        element.appendChild(ul);\r\n        */\r\n\t      element.appendChild(t._iframe);\r\n      };\r\n\r\n      element.style.display = 'block';\r\n    },\r\n\r\n\r\n    /**\r\n     * Close tutorial window.\r\n     */\r\n    hide : function () {\r\n      this._el.style.display = 'none';\r\n    },\r\n\r\n\r\n    /**\r\n     * Set a page to be the current tutorial page.\r\n     * Expects either a string or an element.\r\n     */\r\n    setPage : function (obj) {\r\n      let page = obj;\r\n\r\n      if (typeof page != 'string') {\r\n\t      const l = this._iframe !== null ? window.frames[0].location : window.location;\r\n\r\n\t      page = l.pathname + l.search;\r\n\r\n\t      for (let i = 1; i < 5; i++) {\r\n\t        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {\r\n\t          page += '#' + obj.getAttribute('id');\r\n\t          break;\r\n\t        }\r\n\t        else {\r\n\t          obj = obj.parentNode;\r\n            if (obj === null)\r\n              break;\r\n\t        };\r\n\t      };\r\n      };\r\n\r\n      this._session.set('tutpage', page);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the current tutorial URL\r\n     */\r\n    getPage : function () {\r\n      return this._session.get('tutpage');\r\n    }\r\n  };\r\n});\r\n\r\n\n/**\r\n * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\r\n * Available via the MIT or new BSD license.\r\n * see: http://github.com/requirejs/domReady for details\r\n */\r\n/*jslint */\r\n/*global require: false, define: false, requirejs: false,\r\n  window: false, clearInterval: false, document: false,\r\n  self: false, setInterval: false */\r\n\r\n\r\ndefine('lib/domReady',[],function () {\r\n    'use strict';\r\n\r\n    var isTop, testDiv, scrollIntervalId,\r\n        isBrowser = typeof window !== \"undefined\" && window.document,\r\n        isPageLoaded = !isBrowser,\r\n        doc = isBrowser ? document : null,\r\n        readyCalls = [];\r\n\r\n    function runCallbacks(callbacks) {\r\n        var i;\r\n        for (i = 0; i < callbacks.length; i += 1) {\r\n            callbacks[i](doc);\r\n        }\r\n    }\r\n\r\n    function callReady() {\r\n        var callbacks = readyCalls;\r\n\r\n        if (isPageLoaded) {\r\n            //Call the DOM ready callbacks\r\n            if (callbacks.length) {\r\n                readyCalls = [];\r\n                runCallbacks(callbacks);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the page as loaded.\r\n     */\r\n    function pageLoaded() {\r\n        if (!isPageLoaded) {\r\n            isPageLoaded = true;\r\n            if (scrollIntervalId) {\r\n                clearInterval(scrollIntervalId);\r\n            }\r\n\r\n            callReady();\r\n        }\r\n    }\r\n\r\n    if (isBrowser) {\r\n        if (document.addEventListener) {\r\n            //Standards. Hooray! Assumption here that if standards based,\r\n            //it knows about DOMContentLoaded.\r\n            document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\r\n            window.addEventListener(\"load\", pageLoaded, false);\r\n        } else if (window.attachEvent) {\r\n            window.attachEvent(\"onload\", pageLoaded);\r\n\r\n            testDiv = document.createElement('div');\r\n            try {\r\n                isTop = window.frameElement === null;\r\n            } catch (e) {}\r\n\r\n            //DOMContentLoaded approximation that uses a doScroll, as found by\r\n            //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\r\n            //but modified by other contributors, including jdalton\r\n            if (testDiv.doScroll && isTop && window.external) {\r\n                scrollIntervalId = setInterval(function () {\r\n                    try {\r\n                        testDiv.doScroll();\r\n                        pageLoaded();\r\n                    } catch (e) {}\r\n                }, 30);\r\n            }\r\n        }\r\n\r\n        //Check if document already complete, and if so, just trigger page load\r\n        //listeners. Latest webkit browsers also use \"interactive\", and\r\n        //will fire the onDOMContentLoaded before \"interactive\" but not after\r\n        //entering \"interactive\" or \"complete\". More details:\r\n        //http://dev.w3.org/html5/spec/the-end.html#the-end\r\n        //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\r\n        //Hmm, this is more complicated on further use, see \"firing too early\"\r\n        //bug: https://github.com/requirejs/domReady/issues/1\r\n        //so removing the || document.readyState === \"interactive\" test.\r\n        //There is still a window.onload binding that should get fired if\r\n        //DOMContentLoaded is missed.\r\n        if (document.readyState === \"complete\") {\r\n            pageLoaded();\r\n        }\r\n    }\r\n\r\n    /** START OF PUBLIC API **/\r\n\r\n    /**\r\n     * Registers a callback for DOM ready. If DOM is already ready, the\r\n     * callback is called immediately.\r\n     * @param {Function} callback\r\n     */\r\n    function domReady(callback) {\r\n        if (isPageLoaded) {\r\n            callback(doc);\r\n        } else {\r\n            readyCalls.push(callback);\r\n        }\r\n        return domReady;\r\n    }\r\n\r\n    domReady.version = '2.0.1';\r\n\r\n    /**\r\n     * Loader Plugin API method\r\n     */\r\n    domReady.load = function (name, req, onLoad, config) {\r\n        if (config.isBuild) {\r\n            onLoad(null);\r\n        } else {\r\n            domReady(onLoad);\r\n        }\r\n    };\r\n\r\n    /** END OF PUBLIC API **/\r\n\r\n    return domReady;\r\n});\r\n\ndefine('vc/array',[],function () {\r\n  return [\r\n    // layerInfo                   // stored\r\n    // tokenSource                 // stored\r\n    ['author', 'text'],            // text\r\n    // ['biblEditionStatement', 'string'], // stored\r\n    ['corpusAuthor', 'text'],      // text\r\n    // ['corpusEditor', 'string'], // stored\r\n    ['corpusSigle', 'string'],     // string \r\n    ['corpusSubTitle', 'text']  ,  // text\r\n    ['corpusTitle', 'text'],       // text\r\n    ['creationDate', 'date'],      // int\r\n    ['docAuthor', 'text'],         // text\r\n    // ['docEditor', 'string'],    // stored\r\n    ['docSigle', 'string'],        // string\r\n    ['docSubTitle', 'text'],       // text\r\n    ['docTitle', 'text'],          // text\r\n    // ['editor', 'string'],       // stored\r\n    // ['fileEditionStatement', 'string'], // stored\r\n    ['foundries', 'string'],       // keywords\r\n    ['keywords', 'string'],        // keywords\r\n    ['language', 'string'],        // string\r\n    ['license', 'string'],         // string\r\n    // ['pages', 'string'],        // stored\r\n    ['pubDate', 'date'],           // int\r\n    // ['publisher', 'string'],    // stored\r\n    ['pubPlace', 'string'],        // string\r\n    // ['reference', 'string'],    // stored\r\n    ['subTitle', 'text'],          // text\r\n    ['textClass', 'string'],       // keyword\r\n    ['textColumn', 'string'],      // string\r\n    ['textDomain', 'string'],      // string\r\n    ['textSigle', 'string'],       // string\r\n    ['textType', 'string'],        // string\r\n    ['textTypeArt', 'string'],     // string\r\n    ['textTypeRef', 'string'],     // string\r\n    ['title', 'text']              // text\r\n  ]\r\n});\r\n\n/*global define*/\r\n(function (global, undefined) {\r\n\t\"use strict\";\r\n\r\n\tvar document = global.document,\r\n\t    Alertify;\r\n\r\n\tAlertify = function () {\r\n\r\n\t\tvar _alertify = {},\r\n\t\t    dialogs   = {},\r\n\t\t    isopen    = false,\r\n\t\t    keys      = { ENTER: 13, ESC: 27, SPACE: 32 },\r\n\t\t    queue     = [],\r\n\t\t    $, btnCancel, btnOK, btnReset, btnResetBack, btnFocus, elCallee, elCover, elDialog, elLog, form, input, getTransitionEvent;\r\n\r\n\t\t/**\r\n\t\t * Markup pieces\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tdialogs = {\r\n\t\t\tbuttons : {\r\n\t\t\t\tholder : \"<nav class=\\\"alertify-buttons\\\">{{buttons}}</nav>\",\r\n\t\t\t\tsubmit : \"<button type=\\\"submit\\\" class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tok     : \"<button class=\\\"alertify-button alertify-button-ok\\\" id=\\\"alertify-ok\\\">{{ok}}</button>\",\r\n\t\t\t\tcancel : \"<button class=\\\"alertify-button alertify-button-cancel\\\" id=\\\"alertify-cancel\\\">{{cancel}}</button>\"\r\n\t\t\t},\r\n\t\t\tinput   : \"<div class=\\\"alertify-text-wrapper\\\"><input type=\\\"text\\\" class=\\\"alertify-text\\\" id=\\\"alertify-text\\\"></div>\",\r\n\t\t\tmessage : \"<p class=\\\"alertify-message\\\">{{message}}</p>\",\r\n\t\t\tlog     : \"<article class=\\\"alertify-log{{class}}\\\">{{message}}</article>\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Return the proper transitionend event\r\n\t\t * @return {String}    Transition type string\r\n\t\t */\r\n\t\tgetTransitionEvent = function () {\r\n\t\t\tvar t,\r\n\t\t\t    type,\r\n\t\t\t    supported   = false,\r\n\t\t\t    el          = document.createElement(\"fakeelement\"),\r\n\t\t\t    transitions = {\r\n\t\t\t\t    \"WebkitTransition\" : \"webkitTransitionEnd\",\r\n\t\t\t\t    \"MozTransition\"    : \"transitionend\",\r\n\t\t\t\t    \"OTransition\"      : \"otransitionend\",\r\n\t\t\t\t    \"transition\"       : \"transitionend\"\r\n\t\t\t    };\r\n\r\n\t\t\tfor (t in transitions) {\r\n\t\t\t\tif (el.style[t] !== undefined) {\r\n\t\t\t\t\ttype      = transitions[t];\r\n\t\t\t\t\tsupported = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype      : type,\r\n\t\t\t\tsupported : supported\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Shorthand for document.getElementById()\r\n\t\t *\r\n\t\t * @param  {String} id    A specific element ID\r\n\t\t * @return {Object}       HTML element\r\n\t\t */\r\n\t\t$ = function (id) {\r\n\t\t\treturn document.getElementById(id);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Alertify private object\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\t_alertify = {\r\n\r\n\t\t\t/**\r\n\t\t\t * Labels object\r\n\t\t\t * @type {Object}\r\n\t\t\t */\r\n\t\t\tlabels : {\r\n\t\t\t\tok     : \"OK\",\r\n\t\t\t\tcancel : \"Cancel\"\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Delay number\r\n\t\t\t * @type {Number}\r\n\t\t\t */\r\n\t\t\tdelay : 5000,\r\n\r\n\t\t\t/**\r\n\t\t\t * Whether buttons are reversed (default is secondary/primary)\r\n\t\t\t * @type {Boolean}\r\n\t\t\t */\r\n\t\t\tbuttonReverse : false,\r\n\r\n\t\t\t/**\r\n\t\t\t * Which button should be focused by default\r\n\t\t\t * @type {String}\t\"ok\" (default), \"cancel\", or \"none\"\r\n\t\t\t */\r\n\t\t\tbuttonFocus : \"ok\",\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the transition event on load\r\n\t\t\t * @type {[type]}\r\n\t\t\t */\r\n\t\t\ttransition : undefined,\r\n\r\n\t\t\t/**\r\n\t\t\t * Set the proper button click events\r\n\t\t\t *\r\n\t\t\t * @param {Function} fn    [Optional] Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\taddListeners : function (fn) {\r\n\t\t\t\tvar hasOK     = (typeof btnOK !== \"undefined\"),\r\n\t\t\t\t    hasCancel = (typeof btnCancel !== \"undefined\"),\r\n\t\t\t\t    hasInput  = (typeof input !== \"undefined\"),\r\n\t\t\t\t    val       = \"\",\r\n\t\t\t\t    self      = this,\r\n\t\t\t\t    ok, cancel, common, key, reset;\r\n\r\n\t\t\t\t// ok event handler\r\n\t\t\t\tok = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof input !== \"undefined\") val = input.value;\r\n\t\t\t\t\tif (typeof fn === \"function\") {\r\n\t\t\t\t\t\tif (typeof input !== \"undefined\") {\r\n\t\t\t\t\t\t\tfn(true, val);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse fn(true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// cancel event handler\r\n\t\t\t\tcancel = function (event) {\r\n\t\t\t\t\tif (typeof event.preventDefault !== \"undefined\") event.preventDefault();\r\n\t\t\t\t\tcommon(event);\r\n\t\t\t\t\tif (typeof fn === \"function\") fn(false);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// common event handler (keyup, ok and cancel)\r\n\t\t\t\tcommon = function (event) {\r\n\t\t\t\t\tself.hide();\r\n\t\t\t\t\tself.unbind(document.body, \"keyup\", key);\r\n\t\t\t\t\tself.unbind(btnReset, \"focus\", reset);\r\n\t\t\t\t\tif (hasOK) self.unbind(btnOK, \"click\", ok);\r\n\t\t\t\t\tif (hasCancel) self.unbind(btnCancel, \"click\", cancel);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// keyup handler\r\n\t\t\t\tkey = function (event) {\r\n\t\t\t\t\tvar keyCode = event.keyCode;\r\n\t\t\t\t\tif ((keyCode === keys.SPACE && !hasInput) || (hasInput && keyCode === keys.ENTER)) ok(event);\r\n\t\t\t\t\tif (keyCode === keys.ESC && hasCancel) cancel(event);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// reset focus to first item in the dialog\r\n\t\t\t\treset = function (event) {\r\n\t\t\t\t\tif (hasInput) input.focus();\r\n\t\t\t\t\telse if (!hasCancel || self.buttonReverse) btnOK.focus();\r\n\t\t\t\t\telse btnCancel.focus();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// handle reset focus link\r\n\t\t\t\t// this ensures that the keyboard focus does not\r\n\t\t\t\t// ever leave the dialog box until an action has\r\n\t\t\t\t// been taken\r\n\t\t\t\tthis.bind(btnReset, \"focus\", reset);\r\n\t\t\t\tthis.bind(btnResetBack, \"focus\", reset);\r\n\t\t\t\t// handle OK click\r\n\t\t\t\tif (hasOK) this.bind(btnOK, \"click\", ok);\r\n\t\t\t\t// handle Cancel click\r\n\t\t\t\tif (hasCancel) this.bind(btnCancel, \"click\", cancel);\r\n\t\t\t\t// listen for keys, Cancel => ESC\r\n\t\t\t\tthis.bind(document.body, \"keyup\", key);\r\n\t\t\t\tif (!this.transition.supported) {\r\n\t\t\t\t\tthis.setFocus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Bind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to attach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.addEventListener === \"function\") {\r\n\t\t\t\t\tel.addEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.attachEvent) {\r\n\t\t\t\t\tel.attachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Use alertify as the global error handler (using window.onerror)\r\n\t\t\t *\r\n\t\t\t * @return {boolean} success\r\n\t\t\t */\r\n\t\t\thandleErrors : function () {\r\n\t\t\t\tif (typeof global.onerror !== \"undefined\") {\r\n\t\t\t\t\tvar self = this;\r\n\t\t\t\t\tglobal.onerror = function (msg, url, line) {\r\n\t\t\t\t\t\tself.error(\"[\" + msg + \" on line \" + line + \" of \" + url + \"]\", 0);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Append button HTML strings\r\n\t\t\t *\r\n\t\t\t * @param {String} secondary    The secondary button HTML string\r\n\t\t\t * @param {String} primary      The primary button HTML string\r\n\t\t\t *\r\n\t\t\t * @return {String}             The appended button HTML strings\r\n\t\t\t */\r\n\t\t\tappendButtons : function (secondary, primary) {\r\n\t\t\t\treturn this.buttonReverse ? primary + secondary : secondary + primary;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Build the proper message box\r\n\t\t\t *\r\n\t\t\t * @param  {Object} item    Current object in the queue\r\n\t\t\t *\r\n\t\t\t * @return {String}         An HTML string of the message box\r\n\t\t\t */\r\n\t\t\tbuild : function (item) {\r\n\t\t\t\tvar html    = \"\",\r\n\t\t\t\t    type    = item.type,\r\n\t\t\t\t    message = item.message,\r\n\t\t\t\t    css     = item.cssClass || \"\";\r\n\r\n\t\t\t\thtml += \"<div class=\\\"alertify-dialog\\\">\";\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocusBack\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\r\n\t\t\t\tif (_alertify.buttonFocus === \"none\") html += \"<a href=\\\"#\\\" id=\\\"alertify-noneFocus\\\" class=\\\"alertify-hidden\\\"></a>\";\r\n\r\n\t\t\t\t// doens't require an actual form\r\n\t\t\t\tif (type === \"prompt\") html += \"<div id=\\\"alertify-form\\\">\";\r\n\r\n\t\t\t\thtml += \"<article class=\\\"alertify-inner\\\">\";\r\n\t\t\t\thtml += dialogs.message.replace(\"{{message}}\", message);\r\n\r\n\t\t\t\tif (type === \"prompt\") html += dialogs.input;\r\n\r\n\t\t\t\thtml += dialogs.buttons.holder;\r\n\t\t\t\thtml += \"</article>\";\r\n\r\n\t\t\t\tif (type === \"prompt\") html += \"</div>\";\r\n\r\n\t\t\t\thtml += \"<a id=\\\"alertify-resetFocus\\\" class=\\\"alertify-resetFocus\\\" href=\\\"#\\\">Reset Focus</a>\";\r\n\t\t\t\thtml += \"</div>\";\r\n\r\n\t\t\t\tswitch (type) {\r\n\t\t\t\tcase \"confirm\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.ok));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"prompt\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", this.appendButtons(dialogs.buttons.cancel, dialogs.buttons.submit));\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok).replace(\"{{cancel}}\", this.labels.cancel);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"alert\":\r\n\t\t\t\t\thtml = html.replace(\"{{buttons}}\", dialogs.buttons.ok);\r\n\t\t\t\t\thtml = html.replace(\"{{ok}}\", this.labels.ok);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\telDialog.className = \"alertify alertify-\" + type + \" \" + css;\r\n\t\t\t\telCover.className  = \"alertify-cover\";\r\n\t\t\t\treturn html;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Close the log messages\r\n\t\t\t *\r\n\t\t\t * @param  {Object} elem    HTML Element of log message to close\r\n\t\t\t * @param  {Number} wait    [optional] Time (in ms) to wait before automatically hiding the message, if 0 never hide\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tclose : function (elem, wait) {\r\n\t\t\t\t// Unary Plus: +\"2\" === 2\r\n\t\t\t\tvar timer = (wait && !isNaN(wait)) ? +wait : this.delay,\r\n\t\t\t\t    self  = this,\r\n\t\t\t\t    hideElement, transitionDone;\r\n\r\n\t\t\t\t// set click event on log messages\r\n\t\t\t\tthis.bind(elem, \"click\", function () {\r\n\t\t\t\t\thideElement(elem);\r\n\t\t\t\t});\r\n\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(this, self.transition.type, transitionDone);\r\n\t\t\t\t\t// remove log message\r\n\t\t\t\t\telLog.removeChild(this);\r\n\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t};\r\n\t\t\t\t// this sets the hide class to transition out\r\n\t\t\t\t// or removes the child if css transitions aren't supported\r\n\t\t\t\thideElement = function (el) {\r\n\t\t\t\t\t// ensure element exists\r\n\t\t\t\t\tif (typeof el !== \"undefined\" && el.parentNode === elLog) {\r\n\t\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\t\tif (self.transition.supported) {\r\n\t\t\t\t\t\t\tself.bind(el, self.transition.type, transitionDone);\r\n\t\t\t\t\t\t\tel.className += \" alertify-log-hide\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telLog.removeChild(el);\r\n\t\t\t\t\t\t\tif (!elLog.hasChildNodes()) elLog.className += \" alertify-logs-hidden\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\t// never close (until click) if wait is set to 0\r\n\t\t\t\tif (wait === 0) return;\r\n\t\t\t\t// set timeout to auto close the log message\r\n\t\t\t\tsetTimeout(function () { hideElement(elem); }, timer);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Create a dialog box\r\n\t\t\t *\r\n\t\t\t * @param  {String}   message        The message passed from the callee\r\n\t\t\t * @param  {String}   type           Type of dialog to create\r\n\t\t\t * @param  {Function} fn             [Optional] Callback function\r\n\t\t\t * @param  {String}   placeholder    [Optional] Default value for prompt input field\r\n\t\t\t * @param  {String}   cssClass       [Optional] Class(es) to append to dialog box\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tdialog : function (message, type, fn, placeholder, cssClass) {\r\n\t\t\t\t// set the current active element\r\n\t\t\t\t// this allows the keyboard focus to be resetted\r\n\t\t\t\t// after the dialog box is closed\r\n\t\t\t\telCallee = document.activeElement;\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif ((elLog && elLog.scrollTop !== null) && (elCover && elCover.scrollTop !== null)) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof message !== \"string\") throw new Error(\"message must be a string\");\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"type must be a string\");\r\n\t\t\t\tif (typeof fn !== \"undefined\" && typeof fn !== \"function\") throw new Error(\"fn must be a function\");\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\tqueue.push({ type: type, message: message, callback: fn, placeholder: placeholder, cssClass: cssClass });\r\n\t\t\t\tif (!isopen) this.setup();\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Extend the log method to create custom methods\r\n\t\t\t *\r\n\t\t\t * @param  {String} type    Custom method name\r\n\t\t\t *\r\n\t\t\t * @return {Function}\r\n\t\t\t */\r\n\t\t\textend : function (type) {\r\n\t\t\t\tif (typeof type !== \"string\") throw new Error(\"extend method must have exactly one paramter\");\r\n\t\t\t\treturn function (message, wait) {\r\n\t\t\t\t\tthis.log(message, type, wait);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Hide the dialog and rest to defaults\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\thide : function () {\r\n\t\t\t\tvar transitionDone,\r\n\t\t\t\t    self = this;\r\n\t\t\t\t// remove reference from queue\r\n\t\t\t\tqueue.splice(0,1);\r\n\t\t\t\t// if items remaining in the queue\r\n\t\t\t\tif (queue.length > 0) this.setup(true);\r\n\t\t\t\telse {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\t// Hide the dialog box after transition\r\n\t\t\t\t\t// This ensure it doens't block any element from being clicked\r\n\t\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t\t};\r\n\t\t\t\t\t// whether CSS transition exists\r\n\t\t\t\t\tif (this.transition.supported) {\r\n\t\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden\";\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telDialog.className = \"alertify alertify-hide alertify-hidden alertify-isHidden\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telCover.className  = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\t// set focus to the last element or body\r\n\t\t\t\t\t// after the dialog is closed\r\n\t\t\t\t\telCallee.focus();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initialize Alertify\r\n\t\t\t * Create the 2 main elements\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tinit : function () {\r\n\t\t\t\t// ensure legacy browsers support html5 tags\r\n\t\t\t\tdocument.createElement(\"nav\");\r\n\t\t\t\tdocument.createElement(\"article\");\r\n\t\t\t\tdocument.createElement(\"section\");\r\n\t\t\t\t// cover\r\n\t\t\t\tif ($(\"alertify-cover\") == null) {\r\n\t\t\t\t\telCover = document.createElement(\"div\");\r\n\t\t\t\t\telCover.setAttribute(\"id\", \"alertify-cover\");\r\n\t\t\t\t\telCover.className = \"alertify-cover alertify-cover-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elCover);\r\n\t\t\t\t}\r\n\t\t\t\t// main element\r\n\t\t\t\tif ($(\"alertify\") == null) {\r\n\t\t\t\t\tisopen = false;\r\n\t\t\t\t\tqueue = [];\r\n\t\t\t\t\telDialog = document.createElement(\"section\");\r\n\t\t\t\t\telDialog.setAttribute(\"id\", \"alertify\");\r\n\t\t\t\t\telDialog.className = \"alertify alertify-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elDialog);\r\n\t\t\t\t}\r\n\t\t\t\t// log element\r\n\t\t\t\tif ($(\"alertify-logs\") == null) {\r\n\t\t\t\t\telLog = document.createElement(\"section\");\r\n\t\t\t\t\telLog.setAttribute(\"id\", \"alertify-logs\");\r\n\t\t\t\t\telLog.className = \"alertify-logs alertify-logs-hidden\";\r\n\t\t\t\t\tdocument.body.appendChild(elLog);\r\n\t\t\t\t}\r\n\t\t\t\t// set tabindex attribute on body element\r\n\t\t\t\t// this allows script to give it focus\r\n\t\t\t\t// after the dialog is closed\r\n\t\t\t\tdocument.body.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t// set transition type\r\n\t\t\t\tthis.transition = getTransitionEvent();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Show a new log message box\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Optional type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding the log\r\n\t\t\t *\r\n\t\t\t * @return {Object}\r\n\t\t\t */\r\n\t\t\tlog : function (message, type, wait) {\r\n\t\t\t\t// check to ensure the alertify dialog element\r\n\t\t\t\t// has been successfully created\r\n\t\t\t\tvar check = function () {\r\n\t\t\t\t\tif (elLog && elLog.scrollTop !== null) return;\r\n\t\t\t\t\telse check();\r\n\t\t\t\t};\r\n\t\t\t\t// initialize alertify if it hasn't already been done\r\n\t\t\t\tthis.init();\r\n\t\t\t\tcheck();\r\n\r\n\t\t\t\telLog.className = \"alertify-logs\";\r\n\t\t\t\tthis.notify(message, type, wait);\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Add new log message\r\n\t\t\t * If a type is passed, a class name \"alertify-log-{type}\" will get added.\r\n\t\t\t * This allows for custom look and feel for various types of notifications.\r\n\t\t\t *\r\n\t\t\t * @param  {String} message    The message passed from the callee\r\n\t\t\t * @param  {String} type       [Optional] Type of log message\r\n\t\t\t * @param  {Number} wait       [Optional] Time (in ms) to wait before auto-hiding\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tnotify : function (message, type, wait) {\r\n\t\t\t\tvar log = document.createElement(\"article\");\r\n\t\t\t\tlog.className = \"alertify-log\" + ((typeof type === \"string\" && type !== \"\") ? \" alertify-log-\" + type : \"\");\r\n\t\t\t\tlog.innerHTML = message;\r\n\t\t\t\t// append child\r\n\t\t\t\telLog.appendChild(log);\r\n\t\t\t\t// triggers the CSS animation\r\n\t\t\t\tsetTimeout(function() { log.className = log.className + \" alertify-log-show\"; }, 50);\r\n\t\t\t\tthis.close(log, wait);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Set properties\r\n\t\t\t *\r\n\t\t\t * @param {Object} args     Passing parameters\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tset : function (args) {\r\n\t\t\t\tvar k;\r\n\t\t\t\t// error catching\r\n\t\t\t\tif (typeof args !== \"object\" && args instanceof Array) throw new Error(\"args must be an object\");\r\n\t\t\t\t// set parameters\r\n\t\t\t\tfor (k in args) {\r\n\t\t\t\t\tif (args.hasOwnProperty(k)) {\r\n\t\t\t\t\t\tthis[k] = args[k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Common place to set focus to proper element\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetFocus : function () {\r\n\t\t\t\tif (input) {\r\n\t\t\t\t\tinput.focus();\r\n\t\t\t\t\tinput.select();\r\n\t\t\t\t}\r\n\t\t\t\telse btnFocus.focus();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Initiate all the required pieces for the dialog box\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tsetup : function (fromQueue) {\r\n\t\t\t\tvar item = queue[0],\r\n\t\t\t\t    self = this,\r\n\t\t\t\t    transitionDone;\r\n\r\n\t\t\t\t// dialog is open\r\n\t\t\t\tisopen = true;\r\n\t\t\t\t// Set button focus after transition\r\n\t\t\t\ttransitionDone = function (event) {\r\n\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\tself.setFocus();\r\n\t\t\t\t\t// unbind event so function only gets called once\r\n\t\t\t\t\tself.unbind(elDialog, self.transition.type, transitionDone);\r\n\t\t\t\t};\r\n\t\t\t\t// whether CSS transition exists\r\n\t\t\t\tif (this.transition.supported && !fromQueue) {\r\n\t\t\t\t\tthis.bind(elDialog, this.transition.type, transitionDone);\r\n\t\t\t\t}\r\n\t\t\t\t// build the proper dialog HTML\r\n\t\t\t\telDialog.innerHTML = this.build(item);\r\n\t\t\t\t// assign all the common elements\r\n\t\t\t\tbtnReset  = $(\"alertify-resetFocus\");\r\n\t\t\t\tbtnResetBack  = $(\"alertify-resetFocusBack\");\r\n\t\t\t\tbtnOK     = $(\"alertify-ok\")     || undefined;\r\n\t\t\t\tbtnCancel = $(\"alertify-cancel\") || undefined;\r\n\t\t\t\tbtnFocus  = (_alertify.buttonFocus === \"cancel\") ? btnCancel : ((_alertify.buttonFocus === \"none\") ? $(\"alertify-noneFocus\") : btnOK),\r\n\t\t\t\tinput     = $(\"alertify-text\")   || undefined;\r\n\t\t\t\tform      = $(\"alertify-form\")   || undefined;\r\n\t\t\t\t// add placeholder value to the input field\r\n\t\t\t\tif (typeof item.placeholder === \"string\" && item.placeholder !== \"\") input.value = item.placeholder;\r\n\t\t\t\tif (fromQueue) this.setFocus();\r\n\t\t\t\tthis.addListeners(item.callback);\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Unbind events to elements\r\n\t\t\t *\r\n\t\t\t * @param  {Object}   el       HTML Object\r\n\t\t\t * @param  {Event}    event    Event to detach to element\r\n\t\t\t * @param  {Function} fn       Callback function\r\n\t\t\t *\r\n\t\t\t * @return {undefined}\r\n\t\t\t */\r\n\t\t\tunbind : function (el, event, fn) {\r\n\t\t\t\tif (typeof el.removeEventListener === \"function\") {\r\n\t\t\t\t\tel.removeEventListener(event, fn, false);\r\n\t\t\t\t} else if (el.detachEvent) {\r\n\t\t\t\t\tel.detachEvent(\"on\" + event, fn);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\talert   : function (message, fn, cssClass) { _alertify.dialog(message, \"alert\", fn, \"\", cssClass); return this; },\r\n\t\t\tconfirm : function (message, fn, cssClass) { _alertify.dialog(message, \"confirm\", fn, \"\", cssClass); return this; },\r\n\t\t\textend  : _alertify.extend,\r\n\t\t\tinit    : _alertify.init,\r\n\t\t\tlog     : function (message, type, wait) { _alertify.log(message, type, wait); return this; },\r\n\t\t\tprompt  : function (message, fn, placeholder, cssClass) { _alertify.dialog(message, \"prompt\", fn, placeholder, cssClass); return this; },\r\n\t\t\tsuccess : function (message, wait) { _alertify.log(message, \"success\", wait); return this; },\r\n\t\t\terror   : function (message, wait) { _alertify.log(message, \"error\", wait); return this; },\r\n\t\t\tset     : function (args) { _alertify.set(args); },\r\n\t\t\tlabels  : _alertify.labels,\r\n\t\t\tdebug   : _alertify.handleErrors\r\n\t\t};\r\n\t};\r\n\r\n\t// AMD and window support\r\n\tif (typeof define === \"function\") {\r\n\t\tdefine('lib/alertify',[], function () { return new Alertify(); });\r\n\t} else if (typeof global.alertify === \"undefined\") {\r\n\t\tglobal.alertify = new Alertify();\r\n\t}\r\n\r\n}(this));\r\n\n\r\n\r\ndefine('selectMenu/item',['menu/item'], function (itemClass) {\r\n  /**\r\n   * Menu item for select menus.\r\n   */\r\n  return {\r\n\r\n    /**\r\n     * Create new menu item\r\n     * for tree views.\r\n     */\r\n    create : function (params) {\r\n      return Object.create(itemClass)\r\n\t      .upgradeTo(this)._init(params);\r\n    },\r\n\r\n\r\n    /**\r\n     * Override click action of the menu item.\r\n     */\r\n    onclick : function (e) {\r\n      var menu = this.menu();\r\n      menu.hide();\r\n      // Index was set on initialization\r\n      menu.select(this._index);\r\n      menu.showTitle();\r\n      e.halt();\r\n    },\r\n\r\n\r\n    /**\r\n     * Get title of item.\r\n     */\r\n    title : function () {\r\n      return this.content().textContent;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine(\r\n  'selectMenu',['menu', 'selectMenu/item', 'util'],\r\n  function (menuClass, selectMenuItemClass) {\r\n\r\n    return {\r\n      create : function (element) {\r\n\r\n\t      const select = element.getElementsByTagName('select')[0];\r\n\r\n        if (select === null)\r\n          return;\r\n\r\n\t      // Prepare list before object upgras\r\n\t      const list = [];\r\n\r\n        // Iterate through options list\r\n        // Get option item and add to list\r\n        Array.from(\r\n          select.getElementsByTagName('option')\r\n        ).forEach(function(item) {\r\n        \r\n\t        const opt = [\r\n\t          item.textContent,\r\n\t          item.getAttribute('value')\r\n\t        ];\r\n\r\n          // If the item has an attribute - list\r\n\t        if (item.hasAttribute('desc'))\r\n\t          opt.push(item.getAttribute('desc'));\r\n\r\n\t        list.push(opt);\r\n\t      });\r\n\r\n\t      // Create object with list\r\n\t      const obj = Object.create(menuClass).upgradeTo(this)\r\n\t            ._init(\r\n                list, {\r\n\t                itemClass : selectMenuItemClass\r\n\t              }\r\n              );\r\n        \r\n\t      obj._container = element;\r\n\t      obj._select = select;\r\n\t      select.style.display = 'none';\r\n\r\n\t      // Create title\r\n\t      obj._title = obj._container.addE('span');\r\n\t      obj._title.addT('');\r\n\r\n        obj._container.appendChild(obj.element());\r\n\r\n        // Show the menu\r\n\t      obj._container.addEventListener('click', obj.showSelected.bind(obj));\r\n\r\n\t      // Add index information to each item\r\n\t      obj._items.forEach((e,i) => e._index = i);\r\n\r\n\t      // This is only domspecific\r\n\t      obj.element().addEventListener('blur', function (e) {\r\n\t        this.menu.hide();\r\n\t        this.menu.showTitle();\r\n\t      });\r\n\r\n\t      // In case another tool changes\r\n\t      // the option via JS - this needs\r\n\t      // to be reflected!\r\n\t      select.addEventListener('change', function (e) {\r\n\t        this.showTitle();\r\n\t      }.bind(obj));\r\n\r\n\t      obj.showTitle();\r\n\t      return obj;\r\n      },\r\n\r\n      /**\r\n       * Get or set the selection index\r\n       */\r\n      select : function (index) {\r\n        const t = this;\r\n\t      if (arguments.length > 0) {\r\n\t        t._selected = index;\r\n\t        t._select.selectedIndex = index;\r\n\t      };\r\n\r\n\t      return t._selected || t._select.selectedIndex || 0;\r\n      },\r\n\r\n\r\n      /**\r\n       * Set the select value\r\n       */\r\n      selectValue : function (vParam) {\r\n        const t = this;\r\n        const qlf = t._select.options;\r\n        for (let i = 0; i < qlf.length; i++) {\r\n\t        if (qlf[i].value == vParam) {\r\n            t.hide();\r\n            t.select(i);\r\n            t.showTitle();\r\n            break;\r\n\t        };\r\n        };\r\n        return t;\r\n      },\r\n      \r\n\r\n      /**\r\n       * Show the select menu\r\n       */\r\n      showSelected : function () {\r\n        const t = this;\r\n\t      t._title.style.display = 'none';\r\n\t      t.show(t._selected = t._select.selectedIndex);\r\n\t      t.focus();\r\n      },\r\n\r\n\r\n      /**\r\n       * Show the title\r\n       */\r\n      showTitle : function () {\r\n\r\n        // Get the selection context\r\n        const t = this;\r\n\t      const s = t.select();\r\n\t      t._title.textContent = t.item(\r\n\t        t.select()\r\n\t      ).title();\r\n\t      t._title.style.display = 'inline';\r\n      }\r\n    }\r\n  }\r\n);\r\n\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define('lib/highlight/highlight.pack',[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight|plain|text/.test(e)})[0]}function i(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function o(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function u(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){l+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function c(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,o){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),o&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&o.tE&&(a.tE+=(a.e?\"|\":\"\")+o.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(i(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,o);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=E.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":x.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function d(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function h(){if(L.sL&&!w[L.sL])return n(y);var e=L.sL?s(L.sL,y,!0,M[L.sL]):l(y);return L.r>0&&(B+=e.r),\"continuous\"==L.subLanguageMode&&(M[L.sL]=e.top),p(e.language,e.value,!1,!0)}function b(){return void 0!==L.sL?h():d()}function v(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(f(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var E=N(e);if(!E)throw new Error('Unknown language: \"'+e+'\"');c(E);var R,L=i||E,M={},k=\"\";for(R=L;R!=E;R=R.parent)R.cN&&(k=p(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(S){if(-1!=S.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw S}}function l(e,t){t=t||x.languages||Object.keys(w);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?E[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight|plain|text/.test(n)){var t;x.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,i=n?s(n,r,!0):l(r),c=o(t);if(c.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=i.value,i.value=u(c,o(p),r)}i.value=f(i.value),e.innerHTML=i.value,e.className=g(e.className,n,i.language),e.result={language:i.language,re:i.r},i.second_best&&(e.second_best={language:i.second_best.language,re:i.second_best.r})}}function d(e){x=i(x,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function b(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function v(n,t){var r=w[n]=t(e);r.aliases&&r.aliases.forEach(function(e){E[e]=n})}function m(){return Object.keys(w)}function N(e){return w[e]||w[E[e]]}var x={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},w={},E={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=b,e.registerLanguage=v,e.listLanguages=m,e.getLanguage=N,e.inherit=i,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});\n\r\n\r\ndefine('view/result/koralquery',[\r\n  'view',\r\n  'lib/highlight/highlight.pack',\r\n], function (viewClass) {\r\n  return {\r\n    create : function (classes) {\r\n      return Object.create(viewClass)\r\n        ._init(classes)\r\n        .upgradeTo(this);\r\n    },\r\n\r\n    /**\r\n     * KoralQuery view element\r\n     */\r\n    show : function () {\r\n      if (this._show)\r\n        return this._show;\r\n\r\n      const kq = document.createElement('div');\r\n      kq.setAttribute('id', 'koralquery');\r\n\r\n      const kqInner = kq.addE('div');\r\n\r\n      kqInner.addT(\r\n        JSON.stringify(KorAP.koralQuery || {}, null, '  ')\r\n      );\r\n      \r\n      // Highlight the view\r\n      hljs.highlightBlock(kqInner);\r\n\r\n      this._show = kq;\r\n      return kq;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The result panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/result',[\r\n  'panel',\r\n  'view/result/koralquery'\r\n], function (panelClass, kqViewClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  loc.TOGGLE_ALIGN = loc.TOGGLE_ALIGN || 'toggle alignment';\r\n  loc.SHOW_KQ      = loc.SHOW_KQ      || 'show KoralQuery';\r\n\r\n  const aRoll = ['left', 'right','center'];\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['result']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n\r\n      // If plugins are enabled, add all buttons for the result panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all result buttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"result\")\r\n          .forEach(i => this.actions.add.apply(this.actions, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"result\");\r\n      };\r\n      \r\n      this.prepend = true;\r\n      \r\n      return this;\r\n    },\r\n\r\n\r\n    /**\r\n     * Add KoralQuery action to panel\r\n     */\r\n    addKqAction : function () {\r\n\r\n      // Open KoralQuery view\r\n      const kqButton = this.actions.add(\r\n        loc.SHOW_KQ,\r\n        {'cls':['show-kq','button-icon']},\r\n        function () {\r\n\r\n          const t = this;\r\n\r\n          // Show only once - otherwise toggle\r\n          if (t._kq && t._kq.shown()) {\r\n            t._kq.close();\r\n            return;\r\n          };\r\n          \r\n          t._kq = kqViewClass.create();\r\n\r\n          // On close, remove session info on KQ\r\n          t._kq.onClose = function () {\r\n            delete this._opened['kq'];\r\n          }.bind(t);\r\n\r\n          t._opened['kq'] = true;\r\n          t.add(t._kq);\r\n        }\r\n      );\r\n\r\n      // Show KoralQuery in case it's meant to be shown\r\n      if (this._opened['kq'])\r\n        kqButton.click();\r\n    },\r\n\r\n\r\n    /**\r\n     * Add align action to panel\r\n     */\r\n    addAlignAction : function () {\r\n      /**\r\n       * Toggle the alignment (left <=> right)\r\n       */\r\n      this.actions.add(loc.TOGGLE_ALIGN, {'cls':['align','right','button-icon']}, function (e) {\r\n        var olCl = d.querySelector('#search > ol').classList;\r\n\r\n        aRoll.find(function(align, i) {\r\n          if (olCl.contains('align-' + align)) {\r\n            const n  = i >= 2 ? 0 : i+1;\r\n            const nn = n >= 2 ? 0 : n+1;\r\n            olCl.remove('align-' + align);\r\n            olCl.add('align-' + aRoll[n]);\r\n            this.button.toggleClass(aRoll[n], aRoll[nn]);\r\n            return true;\r\n          };\r\n        }, this);\r\n      });    \r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The query panel\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('panel/query',[\r\n  'panel'\r\n], function (panelClass) {\r\n\r\n  const d = document;\r\n\r\n  // Localization values\r\n  const loc = KorAP.Locale;\r\n  \r\n  return {\r\n    create : function (opened) {\r\n      return Object.create(panelClass)._init(['query']).upgradeTo(this)._init(opened);\r\n    },\r\n\r\n    // Initialize panel\r\n    _init : function (opened) {\r\n      this._opened = opened;\r\n      const a = this.actions;\r\n      \r\n      // If plugins are enabled, add all buttons for the query panel\r\n      if (KorAP.Plugin) {\r\n\r\n        // Add all matchbuttons in order\r\n        KorAP.Plugin\r\n          .buttonGroup(\"query\")\r\n          .forEach(i => a.add.apply(a, i));\r\n\r\n        KorAP.Plugin.clearButtonGroup(\"query\")\r\n      };\r\n      \r\n      return this;\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Intro.js v2.9.3\r\n * https://github.com/usablica/intro.js\r\n *\r\n * Copyright (C) 2017 Afshin Mehrabani (@afshinmeh)\r\n */\r\n\r\n(function(f) {\r\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\r\n        module.exports = f();\r\n        // deprecated function\r\n        // @since 2.8.0\r\n        module.exports.introJs = function () {\r\n          console.warn('Deprecated: please use require(\"intro.js\") directly, instead of the introJs method of the function');\r\n          // introJs()\r\n          return f().apply(this, arguments);\r\n        };\r\n    } else if (typeof define === \"function\" && define.amd) {\r\n        define('lib/intro',[], f);\r\n    } else {\r\n        var g;\r\n        if (typeof window !== \"undefined\") {\r\n            g = window;\r\n        } else if (typeof global !== \"undefined\") {\r\n            g = global;\r\n        } else if (typeof self !== \"undefined\") {\r\n            g = self;\r\n        } else {\r\n            g = this;\r\n        }\r\n        g.introJs = f();\r\n    }\r\n})(function () {\r\n  //Default config/variables\r\n  var VERSION = '2.9.3';\r\n\r\n  /**\r\n   * IntroJs main class\r\n   *\r\n   * @class IntroJs\r\n   */\r\n  function IntroJs(obj) {\r\n    this._targetElement = obj;\r\n    this._introItems = [];\r\n\r\n    this._options = {\r\n      /* Next button label in tooltip box */\r\n      nextLabel: 'Next &rarr;',\r\n      /* Previous button label in tooltip box */\r\n      prevLabel: '&larr; Back',\r\n      /* Skip button label in tooltip box */\r\n      skipLabel: 'Skip',\r\n      /* Done button label in tooltip box */\r\n      doneLabel: 'Done',\r\n      /* Hide previous button in the first step? Otherwise, it will be disabled button. */\r\n      hidePrev: false,\r\n      /* Hide next button in the last step? Otherwise, it will be disabled button. */\r\n      hideNext: false,\r\n      /* Default tooltip box position */\r\n      tooltipPosition: 'bottom',\r\n      /* Next CSS class for tooltip boxes */\r\n      tooltipClass: '',\r\n      /* CSS class that is added to the helperLayer */\r\n      highlightClass: '',\r\n      /* Close introduction when pressing Escape button? */\r\n      exitOnEsc: true,\r\n      /* Close introduction when clicking on overlay layer? */\r\n      exitOnOverlayClick: true,\r\n      /* Show step numbers in introduction? */\r\n      showStepNumbers: true,\r\n      /* Let user use keyboard to navigate the tour? */\r\n      keyboardNavigation: true,\r\n      /* Show tour control buttons? */\r\n      showButtons: true,\r\n      /* Show tour bullets? */\r\n      showBullets: true,\r\n      /* Show tour progress? */\r\n      showProgress: false,\r\n      /* Scroll to highlighted element? */\r\n      scrollToElement: true,\r\n      /*\r\n       * Should we scroll the tooltip or target element?\r\n       *\r\n       * Options are: 'element' or 'tooltip'\r\n       */\r\n      scrollTo: 'element',\r\n      /* Padding to add after scrolling when element is not in the viewport (in pixels) */\r\n      scrollPadding: 30,\r\n      /* Set the overlay opacity */\r\n      overlayOpacity: 0.8,\r\n      /* Precedence of positions, when auto is enabled */\r\n      positionPrecedence: [\"bottom\", \"top\", \"right\", \"left\"],\r\n      /* Disable an interaction with element? */\r\n      disableInteraction: false,\r\n      /* Set how much padding to be used around helper element */\r\n      helperElementPadding: 10,\r\n      /* Default hint position */\r\n      hintPosition: 'top-middle',\r\n      /* Hint button label */\r\n      hintButtonLabel: 'Got it',\r\n      /* Adding animation to hints? */\r\n      hintAnimation: true,\r\n      /* additional classes to put on the buttons */\r\n      buttonClass: \"introjs-button\"\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Initiate a new introduction/guide from an element in the page\r\n   *\r\n   * @api private\r\n   * @method _introForElement\r\n   * @param {Object} targetElm\r\n   * @param {String} group\r\n   * @returns {Boolean} Success or not?\r\n   */\r\n  function _introForElement(targetElm, group) {\r\n    var allIntroSteps = targetElm.querySelectorAll(\"*[data-intro]\"),\r\n        introItems = [];\r\n\r\n    if (this._options.steps) {\r\n      //use steps passed programmatically\r\n      _forEach(this._options.steps, function (step) {\r\n        var currentItem = _cloneObject(step);\r\n\r\n        //set the step\r\n        currentItem.step = introItems.length + 1;\r\n\r\n        //use querySelector function only when developer used CSS selector\r\n        if (typeof (currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        //intro without element\r\n        if (typeof (currentItem.element) === 'undefined' || currentItem.element === null) {\r\n          var floatingElementQuery = document.querySelector(\".introjsFloatingElement\");\r\n\r\n          if (floatingElementQuery === null) {\r\n            floatingElementQuery = document.createElement('div');\r\n            floatingElementQuery.className = 'introjsFloatingElement';\r\n\r\n            document.body.appendChild(floatingElementQuery);\r\n          }\r\n\r\n          currentItem.element  = floatingElementQuery;\r\n          currentItem.position = 'floating';\r\n        }\r\n\r\n        currentItem.scrollTo = currentItem.scrollTo || this._options.scrollTo;\r\n\r\n        if (typeof (currentItem.disableInteraction) === 'undefined') {\r\n          currentItem.disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (currentItem.element !== null) {\r\n          introItems.push(currentItem);\r\n        }        \r\n      }.bind(this));\r\n\r\n    } else {\r\n      //use steps from data-* annotations\r\n      var elmsLength = allIntroSteps.length;\r\n      var disableInteraction;\r\n      \r\n      //if there's no element to intro\r\n      if (elmsLength < 1) {\r\n        return false;\r\n      }\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n\r\n        // skip hidden elements\r\n        if (currentElement.style.display === 'none') {\r\n          return;\r\n        }\r\n\r\n        var step = parseInt(currentElement.getAttribute('data-step'), 10);\r\n\r\n        if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n          disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n        } else {\r\n          disableInteraction = this._options.disableInteraction;\r\n        }\r\n\r\n        if (step > 0) {\r\n          introItems[step - 1] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: parseInt(currentElement.getAttribute('data-step'), 10),\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n\r\n      //next add intro items without data-step\r\n      //todo: we need a cleanup here, two loops are redundant\r\n      var nextStep = 0;\r\n\r\n      _forEach(allIntroSteps, function (currentElement) {\r\n        \r\n        // PR #80\r\n        // start intro for groups of elements\r\n        if (group && (currentElement.getAttribute(\"data-intro-group\") !== group)) {\r\n          return;\r\n        }\r\n        \r\n        if (currentElement.getAttribute('data-step') === null) {\r\n\r\n          while (true) {\r\n            if (typeof introItems[nextStep] === 'undefined') {\r\n              break;\r\n            } else {\r\n              nextStep++;\r\n            }\r\n          } \r\n\r\n          if (typeof (currentElement.getAttribute('data-disable-interaction')) !== 'undefined') {\r\n            disableInteraction = !!currentElement.getAttribute('data-disable-interaction');\r\n          } else {\r\n            disableInteraction = this._options.disableInteraction;\r\n          }\r\n\r\n          introItems[nextStep] = {\r\n            element: currentElement,\r\n            intro: currentElement.getAttribute('data-intro'),\r\n            step: nextStep + 1,\r\n            tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n            highlightClass: currentElement.getAttribute('data-highlightclass'),\r\n            position: currentElement.getAttribute('data-position') || this._options.tooltipPosition,\r\n            scrollTo: currentElement.getAttribute('data-scrollto') || this._options.scrollTo,\r\n            disableInteraction: disableInteraction\r\n          };\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    //removing undefined/null elements\r\n    var tempIntroItems = [];\r\n    for (var z = 0; z < introItems.length; z++) {\r\n      if (introItems[z]) {\r\n        // copy non-falsy values to the end of the array\r\n        tempIntroItems.push(introItems[z]);  \r\n      } \r\n    }\r\n\r\n    introItems = tempIntroItems;\r\n\r\n    //Ok, sort all items with given steps\r\n    introItems.sort(function (a, b) {\r\n      return a.step - b.step;\r\n    });\r\n\r\n    //set it to the introJs object\r\n    this._introItems = introItems;\r\n\r\n    //add overlay layer to the page\r\n    if(_addOverlayLayer.call(this, targetElm)) {\r\n      //then, start the show\r\n      _nextStep.call(this);\r\n\r\n      if (this._options.keyboardNavigation) {\r\n        DOMEvent.on(window, 'keydown', _onKeyDown, this, true);\r\n      }\r\n      //for window resize\r\n      DOMEvent.on(window, 'resize', _onResize, this, true);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  function _onResize () {\r\n    this.refresh.call(this);\r\n  }\r\n\r\n  /**\r\n  * on keyCode:\r\n  * https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\r\n  * This feature has been removed from the Web standards.\r\n  * Though some browsers may still support it, it is in\r\n  * the process of being dropped.\r\n  * Instead, you should use KeyboardEvent.code,\r\n  * if it's implemented.\r\n  *\r\n  * jQuery's approach is to test for\r\n  *   (1) e.which, then\r\n  *   (2) e.charCode, then\r\n  *   (3) e.keyCode\r\n  * https://github.com/jquery/jquery/blob/a6b0705294d336ae2f63f7276de0da1195495363/src/event.js#L638\r\n  *\r\n  * @param type var\r\n  * @return type\r\n  */\r\n  function _onKeyDown (e) {\r\n    var code = (e.code === null) ? e.which : e.code;\r\n\r\n    // if code/e.which is null\r\n    if (code === null) {\r\n      code = (e.charCode === null) ? e.keyCode : e.charCode;\r\n    }\r\n    \r\n    if ((code === 'Escape' || code === 27) && this._options.exitOnEsc === true) {\r\n      //escape key pressed, exit the intro\r\n      //check if exit callback is defined\r\n      _exitIntro.call(this, this._targetElement);\r\n    } else if (code === 'ArrowLeft' || code === 37) {\r\n      //left arrow\r\n      _previousStep.call(this);\r\n    } else if (code === 'ArrowRight' || code === 39) {\r\n      //right arrow\r\n      _nextStep.call(this);\r\n    } else if (code === 'Enter' || code === 13) {\r\n      //srcElement === ie\r\n      var target = e.target || e.srcElement;\r\n      if (target && target.className.match('introjs-prevbutton')) {\r\n        //user hit enter while focusing on previous button\r\n        _previousStep.call(this);\r\n      } else if (target && target.className.match('introjs-skipbutton')) {\r\n        //user hit enter while focusing on skip button\r\n        if (this._introItems.length - 1 === this._currentStep && typeof (this._introCompleteCallback) === 'function') {\r\n            this._introCompleteCallback.call(this);\r\n        }\r\n\r\n        _exitIntro.call(this, this._targetElement);\r\n      } else if (target && target.getAttribute('data-stepnumber')) {\r\n        // user hit enter while focusing on step bullet\r\n        target.click();\r\n      } else {\r\n        //default behavior for responding to enter\r\n        _nextStep.call(this);\r\n      }\r\n\r\n      //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers\r\n      if(e.preventDefault) {\r\n        e.preventDefault();\r\n      } else {\r\n        e.returnValue = false;\r\n      }\r\n    }\r\n  }\r\n\r\n /*\r\n   * makes a copy of the object\r\n   * @api private\r\n   * @method _cloneObject\r\n  */\r\n  function _cloneObject(object) {\r\n      if (object === null || typeof (object) !== 'object' || typeof (object.nodeType) !== 'undefined') {\r\n        return object;\r\n      }\r\n      var temp = {};\r\n      for (var key in object) {\r\n        if (typeof(window.jQuery) !== 'undefined' && object[key] instanceof window.jQuery) {\r\n          temp[key] = object[key];\r\n        } else {\r\n          temp[key] = _cloneObject(object[key]);\r\n        }\r\n      }\r\n      return temp;\r\n  }\r\n  /**\r\n   * Go to specific step of introduction\r\n   *\r\n   * @api private\r\n   * @method _goToStep\r\n   */\r\n  function _goToStep(step) {\r\n    //because steps starts with zero\r\n    this._currentStep = step - 2;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to the specific step of introduction with the explicit [data-step] number\r\n   *\r\n   * @api private\r\n   * @method _goToStepNumber\r\n   */\r\n  function _goToStepNumber(step) {\r\n    this._currentStepNumber = step;\r\n    if (typeof (this._introItems) !== 'undefined') {\r\n      _nextStep.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Go to next step on intro\r\n   *\r\n   * @api private\r\n   * @method _nextStep\r\n   */\r\n  function _nextStep() {\r\n    this._direction = 'forward';\r\n\r\n    if (typeof (this._currentStepNumber) !== 'undefined') {\r\n      _forEach(this._introItems, function (item, i) {\r\n        if( item.step === this._currentStepNumber ) {\r\n          this._currentStep = i - 1;\r\n          this._currentStepNumber = undefined;\r\n        }\r\n      }.bind(this));\r\n    }\r\n\r\n    if (typeof (this._currentStep) === 'undefined') {\r\n      this._currentStep = 0;\r\n    } else {\r\n      ++this._currentStep;\r\n    }\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      --this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    if ((this._introItems.length) <= this._currentStep) {\r\n      //end of the intro\r\n      //check if any callback is defined\r\n      if (typeof (this._introCompleteCallback) === 'function') {\r\n        this._introCompleteCallback.call(this);\r\n      }\r\n      _exitIntro.call(this, this._targetElement);\r\n      return;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Go to previous step on intro\r\n   *\r\n   * @api private\r\n   * @method _previousStep\r\n   */\r\n  function _previousStep() {\r\n    this._direction = 'backward';\r\n\r\n    if (this._currentStep === 0) {\r\n      return false;\r\n    }\r\n\r\n    --this._currentStep;\r\n\r\n    var nextStep = this._introItems[this._currentStep];\r\n    var continueStep = true;\r\n\r\n    if (typeof (this._introBeforeChangeCallback) !== 'undefined') {\r\n      continueStep = this._introBeforeChangeCallback.call(this, nextStep.element);\r\n    }\r\n\r\n    // if `onbeforechange` returned `false`, stop displaying the element\r\n    if (continueStep === false) {\r\n      ++this._currentStep;\r\n      return false;\r\n    }\r\n\r\n    _showElement.call(this, nextStep);\r\n  }\r\n\r\n  /**\r\n   * Update placement of the intro objects on the screen\r\n   * @api private\r\n   */\r\n  function _refresh() {\r\n    // re-align intros\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));\r\n    _setHelperLayerPosition.call(this, document.querySelector('.introjs-disableInteraction'));\r\n\r\n    // re-align tooltip\r\n    if(this._currentStep !== undefined && this._currentStep !== null) {\r\n      var oldHelperNumberLayer = document.querySelector('.introjs-helperNumberLayer'),\r\n        oldArrowLayer        = document.querySelector('.introjs-arrow'),\r\n        oldtooltipContainer  = document.querySelector('.introjs-tooltip');\r\n      _placeTooltip.call(this, this._introItems[this._currentStep].element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n    }\r\n\r\n    //re-align hints\r\n    _reAlignHints.call(this);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Exit from intro\r\n   *\r\n   * @api private\r\n   * @method _exitIntro\r\n   * @param {Object} targetElement\r\n   * @param {Boolean} force - Setting to `true` will skip the result of beforeExit callback\r\n   */\r\n  function _exitIntro(targetElement, force) {\r\n    var continueExit = true;\r\n\r\n    // calling onbeforeexit callback\r\n    //\r\n    // If this callback return `false`, it would halt the process\r\n    if (this._introBeforeExitCallback !== undefined) {\r\n      continueExit = this._introBeforeExitCallback.call(this);\r\n    }\r\n\r\n    // skip this check if `force` parameter is `true`\r\n    // otherwise, if `onbeforeexit` returned `false`, don't exit the intro\r\n    if (!force && continueExit === false) return;\r\n\r\n    //remove overlay layers from the page\r\n    var overlayLayers = targetElement.querySelectorAll('.introjs-overlay');\r\n\r\n    if (overlayLayers && overlayLayers.length) {\r\n      _forEach(overlayLayers, function (overlayLayer) {\r\n        overlayLayer.style.opacity = 0;\r\n        window.setTimeout(function () {\r\n          if (this.parentNode) {\r\n            this.parentNode.removeChild(this);\r\n          }\r\n        }.bind(overlayLayer), 500);\r\n      }.bind(this));\r\n    }\r\n\r\n    //remove all helper layers\r\n    var helperLayer = targetElement.querySelector('.introjs-helperLayer');\r\n    if (helperLayer) {\r\n      helperLayer.parentNode.removeChild(helperLayer);\r\n    }\r\n\r\n    var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');\r\n    if (referenceLayer) {\r\n      referenceLayer.parentNode.removeChild(referenceLayer);\r\n    }\r\n\r\n    //remove disableInteractionLayer\r\n    var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //remove intro floating element\r\n    var floatingElement = document.querySelector('.introjsFloatingElement');\r\n    if (floatingElement) {\r\n      floatingElement.parentNode.removeChild(floatingElement);\r\n    }\r\n\r\n    _removeShowElement();\r\n\r\n    //remove `introjs-fixParent` class from the elements\r\n    var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n    _forEach(fixParents, function (parent) {\r\n      _removeClass(parent, /introjs-fixParent/g);\r\n    });\r\n\r\n    //clean listeners\r\n    DOMEvent.off(window, 'keydown', _onKeyDown, this, true);\r\n    DOMEvent.off(window, 'resize', _onResize, this, true);\r\n\r\n    //check if any callback is defined\r\n    if (this._introExitCallback !== undefined) {\r\n      this._introExitCallback.call(this);\r\n    }\r\n\r\n    //set the step to zero\r\n    this._currentStep = undefined;\r\n  }\r\n\r\n  /**\r\n   * Render tooltip box in the page\r\n   *\r\n   * @api private\r\n   * @method _placeTooltip\r\n   * @param {HTMLElement} targetElement\r\n   * @param {HTMLElement} tooltipLayer\r\n   * @param {HTMLElement} arrowLayer\r\n   * @param {HTMLElement} helperNumberLayer\r\n   * @param {Boolean} hintMode\r\n   */\r\n  function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer, hintMode) {\r\n    var tooltipCssClass = '',\r\n        currentStepObj,\r\n        tooltipOffset,\r\n        targetOffset,\r\n        windowSize,\r\n        currentTooltipPosition;\r\n\r\n    hintMode = hintMode || false;\r\n\r\n    //reset the old style\r\n    tooltipLayer.style.top        = null;\r\n    tooltipLayer.style.right      = null;\r\n    tooltipLayer.style.bottom     = null;\r\n    tooltipLayer.style.left       = null;\r\n    tooltipLayer.style.marginLeft = null;\r\n    tooltipLayer.style.marginTop  = null;\r\n\r\n    arrowLayer.style.display = 'inherit';\r\n\r\n    if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n      helperNumberLayer.style.top  = null;\r\n      helperNumberLayer.style.left = null;\r\n    }\r\n\r\n    //prevent error when `this._currentStep` is undefined\r\n    if (!this._introItems[this._currentStep]) return;\r\n\r\n    //if we have a custom css class for each step\r\n    currentStepObj = this._introItems[this._currentStep];\r\n    if (typeof (currentStepObj.tooltipClass) === 'string') {\r\n      tooltipCssClass = currentStepObj.tooltipClass;\r\n    } else {\r\n      tooltipCssClass = this._options.tooltipClass;\r\n    }\r\n\r\n    tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\\s+|\\s+$/g, '');\r\n    tooltipLayer.setAttribute('role', 'dialog');\r\n\r\n    currentTooltipPosition = this._introItems[this._currentStep].position;\r\n\r\n    // Floating is always valid, no point in calculating\r\n    if (currentTooltipPosition !== \"floating\") { \r\n      currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);\r\n    }\r\n\r\n    var tooltipLayerStyleLeft;\r\n    targetOffset  = _getOffset(targetElement);\r\n    tooltipOffset = _getOffset(tooltipLayer);\r\n    windowSize    = _getWinSize();\r\n\r\n    _addClass(tooltipLayer, 'introjs-' + currentTooltipPosition);\r\n\r\n    switch (currentTooltipPosition) {\r\n      case 'top-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-right';\r\n\r\n        var tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.bottom    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'top-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow bottom-middle';\r\n\r\n        var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      case 'top-left-aligned':\r\n      // top-left-aligned is the same as the default top\r\n      case 'top':\r\n        arrowLayer.className = 'introjs-arrow bottom';\r\n\r\n        tooltipLayerStyleLeft = (hintMode) ? 0 : 15;\r\n\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.bottom = (targetOffset.height +  20) + 'px';\r\n        break;\r\n      case 'right':\r\n        tooltipLayer.style.left = (targetOffset.width + 20) + 'px';\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, right would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          arrowLayer.className = \"introjs-arrow left-bottom\";\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow left';\r\n        }\r\n        break;\r\n      case 'left':\r\n        if (!hintMode && this._options.showStepNumbers === true) {\r\n          tooltipLayer.style.top = '15px';\r\n        }\r\n\r\n        if (targetOffset.top + tooltipOffset.height > windowSize.height) {\r\n          // In this case, left would have fallen below the bottom of the screen.\r\n          // Modify so that the bottom of the tooltip connects with the target\r\n          tooltipLayer.style.top = \"-\" + (tooltipOffset.height - targetOffset.height - 20) + \"px\";\r\n          arrowLayer.className = 'introjs-arrow right-bottom';\r\n        } else {\r\n          arrowLayer.className = 'introjs-arrow right';\r\n        }\r\n        tooltipLayer.style.right = (targetOffset.width + 20) + 'px';\r\n\r\n        break;\r\n      case 'floating':\r\n        arrowLayer.style.display = 'none';\r\n\r\n        //we have to adjust the top and left of layer manually for intro items without element\r\n        tooltipLayer.style.left   = '50%';\r\n        tooltipLayer.style.top    = '50%';\r\n        tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2)  + 'px';\r\n        tooltipLayer.style.marginTop  = '-' + (tooltipOffset.height / 2) + 'px';\r\n\r\n        if (typeof(helperNumberLayer) !== 'undefined' && helperNumberLayer !== null) {\r\n          helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';\r\n          helperNumberLayer.style.top  = '-' + ((tooltipOffset.height / 2) + 18) + 'px';\r\n        }\r\n\r\n        break;\r\n      case 'bottom-right-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-right';\r\n\r\n        tooltipLayerStyleRight = 0;\r\n        _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n        break;\r\n\r\n      case 'bottom-middle-aligned':\r\n        arrowLayer.className      = 'introjs-arrow top-middle';\r\n\r\n        tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;\r\n\r\n        // a fix for middle aligned hints\r\n        if (hintMode) {\r\n          tooltipLayerStyleLeftRight += 5;\r\n        }\r\n\r\n        if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {\r\n          tooltipLayer.style.right = null;\r\n          _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);\r\n        }\r\n        tooltipLayer.style.top = (targetOffset.height + 20) + 'px';\r\n        break;\r\n\r\n      // case 'bottom-left-aligned':\r\n      // Bottom-left-aligned is the same as the default bottom\r\n      // case 'bottom':\r\n      // Bottom going to follow the default behavior\r\n      default:\r\n        arrowLayer.className = 'introjs-arrow top';\r\n\r\n        tooltipLayerStyleLeft = 0;\r\n        _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);\r\n        tooltipLayer.style.top    = (targetOffset.height +  20) + 'px';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set tooltip left so it doesn't go off the right side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleLeft is ok.  false, otherwise.\r\n   */\r\n  function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {\r\n    if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {\r\n      // off the right side of the window\r\n      tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Set tooltip right so it doesn't go off the left side of the window\r\n   *\r\n   * @return boolean true, if tooltipLayerStyleRight is ok.  false, otherwise.\r\n   */\r\n  function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {\r\n    if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {\r\n      // off the left side of the window\r\n      tooltipLayer.style.left = (-targetOffset.left) + 'px';\r\n      return false;\r\n    }\r\n    tooltipLayer.style.right = tooltipLayerStyleRight + 'px';\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Determines the position of the tooltip based on the position precedence and availability\r\n   * of screen space.\r\n   *\r\n   * @param {Object}    targetElement\r\n   * @param {Object}    tooltipLayer\r\n   * @param {String}    desiredTooltipPosition\r\n   * @return {String}   calculatedPosition\r\n   */\r\n  function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {\r\n\r\n    // Take a clone of position precedence. These will be the available\r\n    var possiblePositions = this._options.positionPrecedence.slice();\r\n\r\n    var windowSize = _getWinSize();\r\n    var tooltipHeight = _getOffset(tooltipLayer).height + 10;\r\n    var tooltipWidth = _getOffset(tooltipLayer).width + 20;\r\n    var targetElementRect = targetElement.getBoundingClientRect();\r\n\r\n    // If we check all the possible areas, and there are no valid places for the tooltip, the element\r\n    // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.\r\n    var calculatedPosition = \"floating\";\r\n\r\n    /*\r\n    * auto determine position \r\n    */\r\n\r\n    // Check for space below\r\n    if (targetElementRect.bottom + tooltipHeight + tooltipHeight > windowSize.height) {\r\n      _removeEntry(possiblePositions, \"bottom\");\r\n    }\r\n\r\n    // Check for space above\r\n    if (targetElementRect.top - tooltipHeight < 0) {\r\n      _removeEntry(possiblePositions, \"top\");\r\n    }\r\n\r\n    // Check for space to the right\r\n    if (targetElementRect.right + tooltipWidth > windowSize.width) {\r\n      _removeEntry(possiblePositions, \"right\");\r\n    }\r\n\r\n    // Check for space to the left\r\n    if (targetElementRect.left - tooltipWidth < 0) {\r\n      _removeEntry(possiblePositions, \"left\");\r\n    }\r\n\r\n    // @var {String}  ex: 'right-aligned'\r\n    var desiredAlignment = (function (pos) {\r\n      var hyphenIndex = pos.indexOf('-');\r\n      if (hyphenIndex !== -1) {\r\n        // has alignment\r\n        return pos.substr(hyphenIndex);\r\n      }\r\n      return '';\r\n    })(desiredTooltipPosition || '');\r\n\r\n    // strip alignment from position\r\n    if (desiredTooltipPosition) {\r\n      // ex: \"bottom-right-aligned\"\r\n      // should return 'bottom'\r\n      desiredTooltipPosition = desiredTooltipPosition.split('-')[0];\r\n    }\r\n\r\n    if (possiblePositions.length) {\r\n      if (desiredTooltipPosition !== \"auto\" &&\r\n          possiblePositions.indexOf(desiredTooltipPosition) > -1) {\r\n        // If the requested position is in the list, choose that\r\n        calculatedPosition = desiredTooltipPosition;\r\n      } else {\r\n        // Pick the first valid position, in order\r\n        calculatedPosition = possiblePositions[0];\r\n      }\r\n    }\r\n\r\n    // only top and bottom positions have optional alignments\r\n    if (['top', 'bottom'].indexOf(calculatedPosition) !== -1) {\r\n      calculatedPosition += _determineAutoAlignment(targetElementRect.left, tooltipWidth, windowSize, desiredAlignment);\r\n    }\r\n\r\n    return calculatedPosition;\r\n  }\r\n\r\n  /**\r\n  * auto-determine alignment\r\n  * @param {Integer}  offsetLeft\r\n  * @param {Integer}  tooltipWidth\r\n  * @param {Object}   windowSize\r\n  * @param {String}   desiredAlignment\r\n  * @return {String}  calculatedAlignment\r\n  */\r\n  function _determineAutoAlignment (offsetLeft, tooltipWidth, windowSize, desiredAlignment) {\r\n    var halfTooltipWidth = tooltipWidth / 2,\r\n      winWidth = Math.min(windowSize.width, window.screen.width),\r\n      possibleAlignments = ['-left-aligned', '-middle-aligned', '-right-aligned'],\r\n      calculatedAlignment = '';\r\n    \r\n    // valid left must be at least a tooltipWidth\r\n    // away from right side\r\n    if (winWidth - offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-left-aligned');\r\n    }\r\n\r\n    // valid middle must be at least half \r\n    // width away from both sides\r\n    if (offsetLeft < halfTooltipWidth || \r\n      winWidth - offsetLeft < halfTooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-middle-aligned');\r\n    }\r\n\r\n    // valid right must be at least a tooltipWidth\r\n    // width away from left side\r\n    if (offsetLeft < tooltipWidth) {\r\n      _removeEntry(possibleAlignments, '-right-aligned');\r\n    }\r\n\r\n    if (possibleAlignments.length) {\r\n      if (possibleAlignments.indexOf(desiredAlignment) !== -1) {\r\n        // the desired alignment is valid\r\n        calculatedAlignment = desiredAlignment;\r\n      } else {\r\n        // pick the first valid position, in order\r\n        calculatedAlignment = possibleAlignments[0];\r\n      }\r\n    } else {\r\n      // if screen width is too small \r\n      // for ANY alignment, middle is \r\n      // probably the best for visibility\r\n      calculatedAlignment = '-middle-aligned';\r\n    }\r\n\r\n    return calculatedAlignment;\r\n  }\r\n\r\n  /**\r\n   * Remove an entry from a string array if it's there, does nothing if it isn't there.\r\n   *\r\n   * @param {Array} stringArray\r\n   * @param {String} stringToRemove\r\n   */\r\n  function _removeEntry(stringArray, stringToRemove) {\r\n    if (stringArray.indexOf(stringToRemove) > -1) {\r\n      stringArray.splice(stringArray.indexOf(stringToRemove), 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update the position of the helper layer on the screen\r\n   *\r\n   * @api private\r\n   * @method _setHelperLayerPosition\r\n   * @param {Object} helperLayer\r\n   */\r\n  function _setHelperLayerPosition(helperLayer) {\r\n    if (helperLayer) {\r\n      //prevent error when `this._currentStep` in undefined\r\n      if (!this._introItems[this._currentStep]) return;\r\n\r\n      var currentElement  = this._introItems[this._currentStep],\r\n          elementPosition = _getOffset(currentElement.element),\r\n          widthHeightPadding = this._options.helperElementPadding;\r\n\r\n      // If the target element is fixed, the tooltip should be fixed as well.\r\n      // Otherwise, remove a fixed class that may be left over from the previous\r\n      // step.\r\n      if (_isFixed(currentElement.element)) {\r\n        _addClass(helperLayer, 'introjs-fixedTooltip');\r\n      } else {\r\n        _removeClass(helperLayer, 'introjs-fixedTooltip');\r\n      }\r\n\r\n      if (currentElement.position === 'floating') {\r\n        widthHeightPadding = 0;\r\n      }\r\n\r\n      //set new position to helper layer\r\n      helperLayer.style.cssText = 'width: ' + (elementPosition.width  + widthHeightPadding)  + 'px; ' +\r\n                                        'height:' + (elementPosition.height + widthHeightPadding)  + 'px; ' +\r\n                                        'top:'    + (elementPosition.top    - widthHeightPadding / 2)   + 'px;' +\r\n                                        'left: '  + (elementPosition.left   - widthHeightPadding / 2)   + 'px;';\r\n\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add disableinteraction layer and adjust the size and position of the layer\r\n   *\r\n   * @api private\r\n   * @method _disableInteraction\r\n   */\r\n  function _disableInteraction() {\r\n    var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');\r\n\r\n    if (disableInteractionLayer === null) {\r\n      disableInteractionLayer = document.createElement('div');\r\n      disableInteractionLayer.className = 'introjs-disableInteraction';\r\n      this._targetElement.appendChild(disableInteractionLayer);\r\n    }\r\n\r\n    _setHelperLayerPosition.call(this, disableInteractionLayer);\r\n  }\r\n\r\n  /**\r\n   * Setting anchors to behave like buttons\r\n   *\r\n   * @api private\r\n   * @method _setAnchorAsButton\r\n   */\r\n  function _setAnchorAsButton(anchor){\r\n    anchor.setAttribute('role', 'button');\r\n    anchor.tabIndex = 0;\r\n  }\r\n\r\n  /**\r\n   * Show an element on the page\r\n   *\r\n   * @api private\r\n   * @method _showElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _showElement(targetElement) {\r\n    if (typeof (this._introChangeCallback) !== 'undefined') {\r\n      this._introChangeCallback.call(this, targetElement.element);\r\n    }\r\n\r\n    var self = this,\r\n        oldHelperLayer = document.querySelector('.introjs-helperLayer'),\r\n        oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),\r\n        highlightClass = 'introjs-helperLayer',\r\n        nextTooltipButton,\r\n        prevTooltipButton,\r\n        skipTooltipButton,\r\n        scrollParent;\r\n\r\n    //check for a current step highlight class\r\n    if (typeof (targetElement.highlightClass) === 'string') {\r\n      highlightClass += (' ' + targetElement.highlightClass);\r\n    }\r\n    //check for options highlight class\r\n    if (typeof (this._options.highlightClass) === 'string') {\r\n      highlightClass += (' ' + this._options.highlightClass);\r\n    }\r\n\r\n    if (oldHelperLayer !== null) {\r\n      var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),\r\n          oldtooltipLayer      = oldReferenceLayer.querySelector('.introjs-tooltiptext'),\r\n          oldArrowLayer        = oldReferenceLayer.querySelector('.introjs-arrow'),\r\n          oldtooltipContainer  = oldReferenceLayer.querySelector('.introjs-tooltip');\r\n          \r\n      skipTooltipButton    = oldReferenceLayer.querySelector('.introjs-skipbutton');\r\n      prevTooltipButton    = oldReferenceLayer.querySelector('.introjs-prevbutton');\r\n      nextTooltipButton    = oldReferenceLayer.querySelector('.introjs-nextbutton');\r\n\r\n      //update or reset the helper highlight class\r\n      oldHelperLayer.className = highlightClass;\r\n      //hide the tooltip\r\n      oldtooltipContainer.style.opacity = 0;\r\n      oldtooltipContainer.style.display = \"none\";\r\n\r\n      if (oldHelperNumberLayer !== null) {\r\n        var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];\r\n\r\n        if (lastIntroItem !== null && (this._direction === 'forward' && lastIntroItem.position === 'floating') || (this._direction === 'backward' && targetElement.position === 'floating')) {\r\n          oldHelperNumberLayer.style.opacity = 0;\r\n        }\r\n      }\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      // set new position to helper layer\r\n      _setHelperLayerPosition.call(self, oldHelperLayer);\r\n      _setHelperLayerPosition.call(self, oldReferenceLayer);\r\n\r\n      //remove `introjs-fixParent` class from the elements\r\n      var fixParents = document.querySelectorAll('.introjs-fixParent');\r\n      _forEach(fixParents, function (parent) {\r\n        _removeClass(parent, /introjs-fixParent/g);\r\n      });\r\n      \r\n      //remove old classes if the element still exist\r\n      _removeShowElement();\r\n\r\n      //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation\r\n      if (self._lastShowElementTimer) {\r\n        window.clearTimeout(self._lastShowElementTimer);\r\n      }\r\n\r\n      self._lastShowElementTimer = window.setTimeout(function() {\r\n        //set current step to the label\r\n        if (oldHelperNumberLayer !== null) {\r\n          oldHelperNumberLayer.innerHTML = targetElement.step;\r\n        }\r\n        //set current tooltip text\r\n        oldtooltipLayer.innerHTML = targetElement.intro;\r\n        //set the tooltip position\r\n        oldtooltipContainer.style.display = \"block\";\r\n        _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);\r\n\r\n        //change active bullet\r\n        if (self._options.showBullets) {\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';\r\n            oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber=\"' + targetElement.step + '\"]').className = 'active';\r\n        }\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').style.cssText = 'width:' + _getProgress.call(self) + '%;';\r\n        oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('aria-valuenow', _getProgress.call(self));\r\n\r\n        //show the tooltip\r\n        oldtooltipContainer.style.opacity = 1;\r\n        if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;\r\n\r\n        //reset button focus\r\n        if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null && /introjs-donebutton/gi.test(skipTooltipButton.className)) {\r\n          // skip button is now \"done\" button\r\n          skipTooltipButton.focus();\r\n        } else if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          //still in the tour, focus on next\r\n          nextTooltipButton.focus();\r\n        }\r\n\r\n        // change the scroll of the window, if needed\r\n        _scrollTo.call(self, targetElement.scrollTo, targetElement, oldtooltipLayer);\r\n      }, 350);\r\n\r\n      // end of old element if-else condition\r\n    } else {\r\n      var helperLayer       = document.createElement('div'),\r\n          referenceLayer    = document.createElement('div'),\r\n          arrowLayer        = document.createElement('div'),\r\n          tooltipLayer      = document.createElement('div'),\r\n          tooltipTextLayer  = document.createElement('div'),\r\n          bulletsLayer      = document.createElement('div'),\r\n          progressLayer     = document.createElement('div'),\r\n          buttonsLayer      = document.createElement('div');\r\n\r\n      helperLayer.className = highlightClass;\r\n      referenceLayer.className = 'introjs-tooltipReferenceLayer';\r\n\r\n      // scroll to element\r\n      scrollParent = _getScrollParent( targetElement.element );\r\n\r\n      if (scrollParent !== document.body) {\r\n        // target is within a scrollable element\r\n        _scrollParentToElement(scrollParent, targetElement.element);\r\n      }\r\n\r\n      //set new position to helper layer\r\n      _setHelperLayerPosition.call(self, helperLayer);\r\n      _setHelperLayerPosition.call(self, referenceLayer);\r\n\r\n      //add helper layer to target element\r\n      this._targetElement.appendChild(helperLayer);\r\n      this._targetElement.appendChild(referenceLayer);\r\n\r\n      arrowLayer.className = 'introjs-arrow';\r\n\r\n      tooltipTextLayer.className = 'introjs-tooltiptext';\r\n      tooltipTextLayer.innerHTML = targetElement.intro;\r\n\r\n      bulletsLayer.className = 'introjs-bullets';\r\n\r\n      if (this._options.showBullets === false) {\r\n        bulletsLayer.style.display = 'none';\r\n      }\r\n\r\n      var ulContainer = document.createElement('ul');\r\n      ulContainer.setAttribute('role', 'tablist');\r\n\r\n      var anchorClick = function () {\r\n          self.goToStep(this.getAttribute('data-stepnumber'));\r\n      };\r\n\r\n      _forEach(this._introItems, function (item, i) {\r\n        var innerLi    = document.createElement('li');\r\n        var anchorLink = document.createElement('a');\r\n        \r\n        innerLi.setAttribute('role', 'presentation');\r\n        anchorLink.setAttribute('role', 'tab');\r\n\r\n        anchorLink.onclick = anchorClick;\r\n\r\n        if (i === (targetElement.step-1)) {\r\n          anchorLink.className = 'active';\r\n        } \r\n\r\n        _setAnchorAsButton(anchorLink);\r\n        anchorLink.innerHTML = \"&nbsp;\";\r\n        anchorLink.setAttribute('data-stepnumber', item.step);\r\n\r\n        innerLi.appendChild(anchorLink);\r\n        ulContainer.appendChild(innerLi);\r\n      });\r\n\r\n      bulletsLayer.appendChild(ulContainer);\r\n\r\n      progressLayer.className = 'introjs-progress';\r\n\r\n      if (this._options.showProgress === false) {\r\n        progressLayer.style.display = 'none';\r\n      }\r\n      var progressBar = document.createElement('div');\r\n      progressBar.className = 'introjs-progressbar';\r\n      progressBar.setAttribute('role', 'progress');\r\n      progressBar.setAttribute('aria-valuemin', 0);\r\n      progressBar.setAttribute('aria-valuemax', 100);\r\n      progressBar.setAttribute('aria-valuenow', _getProgress.call(this));\r\n      progressBar.style.cssText = 'width:' + _getProgress.call(this) + '%;';\r\n\r\n      progressLayer.appendChild(progressBar);\r\n\r\n      buttonsLayer.className = 'introjs-tooltipbuttons';\r\n      if (this._options.showButtons === false) {\r\n        buttonsLayer.style.display = 'none';\r\n      }\r\n\r\n      tooltipLayer.className = 'introjs-tooltip';\r\n      tooltipLayer.appendChild(tooltipTextLayer);\r\n      tooltipLayer.appendChild(bulletsLayer);\r\n      tooltipLayer.appendChild(progressLayer);\r\n\r\n      //add helper layer number\r\n      var helperNumberLayer = document.createElement('span');\r\n      if (this._options.showStepNumbers === true) {\r\n        helperNumberLayer.className = 'introjs-helperNumberLayer';\r\n        helperNumberLayer.innerHTML = targetElement.step;\r\n        referenceLayer.appendChild(helperNumberLayer);\r\n      }\r\n\r\n      tooltipLayer.appendChild(arrowLayer);\r\n      referenceLayer.appendChild(tooltipLayer);\r\n\r\n      //next button\r\n      nextTooltipButton = document.createElement('a');\r\n\r\n      nextTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 !== self._currentStep) {\r\n          _nextStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(nextTooltipButton);\r\n      nextTooltipButton.innerHTML = this._options.nextLabel;\r\n\r\n      //previous button\r\n      prevTooltipButton = document.createElement('a');\r\n\r\n      prevTooltipButton.onclick = function() {\r\n        if (self._currentStep !== 0) {\r\n          _previousStep.call(self);\r\n        }\r\n      };\r\n\r\n      _setAnchorAsButton(prevTooltipButton);\r\n      prevTooltipButton.innerHTML = this._options.prevLabel;\r\n\r\n      //skip button\r\n      skipTooltipButton = document.createElement('a');\r\n      skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton ';\r\n      _setAnchorAsButton(skipTooltipButton);\r\n      skipTooltipButton.innerHTML = this._options.skipLabel;\r\n\r\n      skipTooltipButton.onclick = function() {\r\n        if (self._introItems.length - 1 === self._currentStep && typeof (self._introCompleteCallback) === 'function') {\r\n          self._introCompleteCallback.call(self);\r\n        }\r\n\r\n        if (self._introItems.length - 1 !== self._currentStep && typeof (self._introExitCallback) === 'function') {\r\n          self._introExitCallback.call(self);\r\n        }\r\n\r\n        if (typeof(self._introSkipCallback) === 'function') {\r\n          self._introSkipCallback.call(self);\r\n        }\r\n\r\n        _exitIntro.call(self, self._targetElement);\r\n      };\r\n\r\n      buttonsLayer.appendChild(skipTooltipButton);\r\n\r\n      //in order to prevent displaying next/previous button always\r\n      if (this._introItems.length > 1) {\r\n        buttonsLayer.appendChild(prevTooltipButton);\r\n        buttonsLayer.appendChild(nextTooltipButton);\r\n      }\r\n\r\n      tooltipLayer.appendChild(buttonsLayer);\r\n\r\n      //set proper position\r\n      _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);\r\n\r\n      // change the scroll of the window, if needed\r\n      _scrollTo.call(this, targetElement.scrollTo, targetElement, tooltipLayer);\r\n\r\n      //end of new element if-else condition\r\n    }\r\n\r\n    // removing previous disable interaction layer\r\n    var disableInteractionLayer = self._targetElement.querySelector('.introjs-disableInteraction');\r\n    if (disableInteractionLayer) {\r\n      disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);\r\n    }\r\n\r\n    //disable interaction\r\n    if (targetElement.disableInteraction) {\r\n      _disableInteraction.call(self);\r\n    }\r\n\r\n    // when it's the first step of tour\r\n    if (this._currentStep === 0 && this._introItems.length > 1) {\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n\r\n      if (this._options.hidePrev === true) {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-hidden';\r\n        }\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          _addClass(nextTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton introjs-disabled';\r\n        }\r\n      }\r\n\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    } else if (this._introItems.length - 1 === this._currentStep || this._introItems.length === 1) {\r\n      // last step of tour\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.doneLabel;\r\n        // adding donebutton class in addition to skipbutton\r\n        _addClass(skipTooltipButton, 'introjs-donebutton');\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n\r\n      if (this._options.hideNext === true) {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-hidden';\r\n        }\r\n        if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n          _addClass(prevTooltipButton, 'introjs-fullbutton');\r\n        }\r\n      } else {\r\n        if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n          nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton introjs-disabled';\r\n        }\r\n      }\r\n    } else {\r\n      // steps between start and end\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.className = this._options.buttonClass + ' introjs-skipbutton';\r\n      }\r\n      if (typeof prevTooltipButton !== \"undefined\" && prevTooltipButton !== null) {\r\n        prevTooltipButton.className = this._options.buttonClass + ' introjs-prevbutton';\r\n      }\r\n      if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n        nextTooltipButton.className = this._options.buttonClass + ' introjs-nextbutton';\r\n      }\r\n      if (typeof skipTooltipButton !== \"undefined\" && skipTooltipButton !== null) {\r\n        skipTooltipButton.innerHTML = this._options.skipLabel;\r\n      }\r\n    }\r\n\r\n    prevTooltipButton.setAttribute('role', 'button');\r\n    nextTooltipButton.setAttribute('role', 'button');\r\n    skipTooltipButton.setAttribute('role', 'button');\r\n\r\n    //Set focus on \"next\" button, so that hitting Enter always moves you onto the next step\r\n    if (typeof nextTooltipButton !== \"undefined\" && nextTooltipButton !== null) {\r\n      nextTooltipButton.focus();\r\n    }\r\n\r\n    _setShowElement(targetElement);\r\n\r\n    if (typeof (this._introAfterChangeCallback) !== 'undefined') {\r\n      this._introAfterChangeCallback.call(this, targetElement.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To change the scroll of `window` after highlighting an element\r\n   *\r\n   * @api private\r\n   * @method _scrollTo\r\n   * @param {String} scrollTo\r\n   * @param {Object} targetElement\r\n   * @param {Object} tooltipLayer\r\n   */\r\n  function _scrollTo(scrollTo, targetElement, tooltipLayer) {\r\n    if (scrollTo === 'off') return;  \r\n    var rect;\r\n\r\n    if (!this._options.scrollToElement) return;\r\n\r\n    if (scrollTo === 'tooltip') {\r\n      rect = tooltipLayer.getBoundingClientRect();\r\n    } else {\r\n      rect = targetElement.element.getBoundingClientRect();\r\n    }\r\n\r\n    if (!_elementInViewport(targetElement.element)) {\r\n      var winHeight = _getWinSize().height;\r\n      var top = rect.bottom - (rect.bottom - rect.top);\r\n\r\n      // TODO (afshinm): do we need scroll padding now?\r\n      // I have changed the scroll option and now it scrolls the window to\r\n      // the center of the target element or tooltip.\r\n\r\n      if (top < 0 || targetElement.element.clientHeight > winHeight) {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) - this._options.scrollPadding); // 30px padding from edge to look nice\r\n\r\n      //Scroll down\r\n      } else {\r\n        window.scrollBy(0, rect.top - ((winHeight / 2) -  (rect.height / 2)) + this._options.scrollPadding); // 30px padding from edge to look nice\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * To remove all show element(s)\r\n   *\r\n   * @api private\r\n   * @method _removeShowElement\r\n   */\r\n  function _removeShowElement() {\r\n    var elms = document.querySelectorAll('.introjs-showElement');\r\n\r\n    _forEach(elms, function (elm) {\r\n      _removeClass(elm, /introjs-[a-zA-Z]+/g);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * To set the show element\r\n   * This function set a relative (in most cases) position and changes the z-index\r\n   *\r\n   * @api private\r\n   * @method _setShowElement\r\n   * @param {Object} targetElement\r\n   */\r\n  function _setShowElement(targetElement) {\r\n    var parentElm;\r\n    // we need to add this show element class to the parent of SVG elements\r\n    // because the SVG elements can't have independent z-index\r\n    if (targetElement.element instanceof SVGElement) {\r\n      parentElm = targetElement.element.parentNode;\r\n\r\n      while (targetElement.element.parentNode !== null) {\r\n        if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n        if (parentElm.tagName.toLowerCase() === 'svg') {\r\n          _addClass(parentElm, 'introjs-showElement introjs-relativePosition');\r\n        }\r\n\r\n        parentElm = parentElm.parentNode;\r\n      }\r\n    }\r\n\r\n    _addClass(targetElement.element, 'introjs-showElement');\r\n\r\n    var currentElementPosition = _getPropValue(targetElement.element, 'position');\r\n    if (currentElementPosition !== 'absolute' &&\r\n        currentElementPosition !== 'relative' &&\r\n        currentElementPosition !== 'fixed') {\r\n      //change to new intro item\r\n      _addClass(targetElement.element, 'introjs-relativePosition');\r\n    }\r\n\r\n    parentElm = targetElement.element.parentNode;\r\n    while (parentElm !== null) {\r\n      if (!parentElm.tagName || parentElm.tagName.toLowerCase() === 'body') break;\r\n\r\n      //fix The Stacking Context problem.\r\n      //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context\r\n      var zIndex = _getPropValue(parentElm, 'z-index');\r\n      var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));\r\n      var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');\r\n      if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {\r\n        _addClass(parentElm, 'introjs-fixParent');\r\n      }\r\n\r\n      parentElm = parentElm.parentNode;\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Iterates arrays\r\n  *\r\n  * @param {Array} arr\r\n  * @param {Function} forEachFnc\r\n  * @param {Function} completeFnc\r\n  * @return {Null}\r\n  */\r\n  function _forEach(arr, forEachFnc, completeFnc) {\r\n    // in case arr is an empty query selector node list\r\n    if (arr) {\r\n      for (var i = 0, len = arr.length; i < len; i++) {\r\n        forEachFnc(arr[i], i);\r\n      }\r\n    }\r\n\r\n    if (typeof(completeFnc) === 'function') {\r\n      completeFnc();\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Mark any object with an incrementing number\r\n  * used for keeping track of objects\r\n  *\r\n  * @param Object obj   Any object or DOM Element\r\n  * @param String key\r\n  * @return Object\r\n  */\r\n  var _stamp = (function () {\r\n    var keys = {};\r\n    return function stamp (obj, key) {\r\n      \r\n      // get group key\r\n      key = key || 'introjs-stamp';\r\n\r\n      // each group increments from 0\r\n      keys[key] = keys[key] || 0;\r\n\r\n      // stamp only once per object\r\n      if (obj[key] === undefined) {\r\n        // increment key for each new object\r\n        obj[key] = keys[key]++;\r\n      }\r\n\r\n      return obj[key];\r\n    };\r\n  })();\r\n\r\n  /**\r\n  * DOMEvent Handles all DOM events\r\n  *\r\n  * methods:\r\n  *\r\n  * on - add event handler\r\n  * off - remove event\r\n  */\r\n  var DOMEvent = (function () {\r\n    function DOMEvent () {\r\n      var events_key = 'introjs_event';\r\n      \r\n      /**\r\n      * Gets a unique ID for an event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @return String\r\n      */\r\n      this._id = function (obj, type, listener, context) {\r\n        return type + _stamp(listener) + (context ? '_' + _stamp(context) : '');\r\n      };\r\n\r\n      /**\r\n      * Adds event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.on = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = function (e) {\r\n              return listener.call(context || obj, e || window.event);\r\n            };\r\n\r\n        if ('addEventListener' in obj) {\r\n          obj.addEventListener(type, handler, useCapture);\r\n        } else if ('attachEvent' in obj) {\r\n          obj.attachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key] = obj[events_key] || {};\r\n        obj[events_key][id] = handler;\r\n      };\r\n\r\n      /**\r\n      * Removes event listener\r\n      *\r\n      * @param Object obj\r\n      * @param String type        event type\r\n      * @param Function listener\r\n      * @param Object context\r\n      * @param Boolean useCapture\r\n      * @return null\r\n      */\r\n      this.off = function (obj, type, listener, context, useCapture) {\r\n        var id = this._id.apply(this, arguments),\r\n            handler = obj[events_key] && obj[events_key][id];\r\n\r\n        if (!handler) {\r\n          return;\r\n        }\r\n\r\n        if ('removeEventListener' in obj) {\r\n          obj.removeEventListener(type, handler, useCapture);\r\n        } else if ('detachEvent' in obj) {\r\n          obj.detachEvent('on' + type, handler);\r\n        }\r\n\r\n        obj[events_key][id] = null;\r\n      };\r\n    }\r\n\r\n    return new DOMEvent();\r\n  })();\r\n\r\n  /**\r\n   * Append a class to an element\r\n   *\r\n   * @api private\r\n   * @method _addClass\r\n   * @param {Object} element\r\n   * @param {String} className\r\n   * @returns null\r\n   */\r\n  function _addClass(element, className) {\r\n    if (element instanceof SVGElement) {\r\n      // svg\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre + ' ' + className);\r\n    } else {\r\n      if (element.classList !== undefined) {\r\n        // check for modern classList property\r\n        var classes = className.split(' ');\r\n        _forEach(classes, function (cls) {\r\n          element.classList.add( cls );\r\n        });\r\n      } else if (!element.className.match( className )) {\r\n        // check if element doesn't already have className\r\n        element.className += ' ' + className;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a class from an element\r\n   *\r\n   * @api private\r\n   * @method _removeClass\r\n   * @param {Object} element\r\n   * @param {RegExp|String} classNameRegex can be regex or string\r\n   * @returns null\r\n   */\r\n  function _removeClass(element, classNameRegex) {\r\n    if (element instanceof SVGElement) {\r\n      var pre = element.getAttribute('class') || '';\r\n\r\n      element.setAttribute('class', pre.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, ''));\r\n    } else {\r\n      element.className = element.className.replace(classNameRegex, '').replace(/^\\s+|\\s+$/g, '');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an element CSS property on the page\r\n   * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml\r\n   *\r\n   * @api private\r\n   * @method _getPropValue\r\n   * @param {Object} element\r\n   * @param {String} propName\r\n   * @returns Element's property value\r\n   */\r\n  function _getPropValue (element, propName) {\r\n    var propValue = '';\r\n    if (element.currentStyle) { //IE\r\n      propValue = element.currentStyle[propName];\r\n    } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others\r\n      propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);\r\n    }\r\n\r\n    //Prevent exception in IE\r\n    if (propValue && propValue.toLowerCase) {\r\n      return propValue.toLowerCase();\r\n    } else {\r\n      return propValue;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks to see if target element (or parents) position is fixed or not\r\n   *\r\n   * @api private\r\n   * @method _isFixed\r\n   * @param {Object} element\r\n   * @returns Boolean\r\n   */\r\n  function _isFixed (element) {\r\n    var p = element.parentNode;\r\n\r\n    if (!p || p.nodeName === 'HTML') {\r\n      return false;\r\n    }\r\n\r\n    if (_getPropValue(element, 'position') === 'fixed') {\r\n      return true;\r\n    }\r\n\r\n    return _isFixed(p);\r\n  }\r\n\r\n  /**\r\n   * Provides a cross-browser way to get the screen dimensions\r\n   * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight\r\n   *\r\n   * @api private\r\n   * @method _getWinSize\r\n   * @returns {Object} width and height attributes\r\n   */\r\n  function _getWinSize() {\r\n    if (window.innerWidth !== undefined) {\r\n      return { width: window.innerWidth, height: window.innerHeight };\r\n    } else {\r\n      var D = document.documentElement;\r\n      return { width: D.clientWidth, height: D.clientHeight };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check to see if the element is in the viewport or not\r\n   * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport\r\n   *\r\n   * @api private\r\n   * @method _elementInViewport\r\n   * @param {Object} el\r\n   */\r\n  function _elementInViewport(el) {\r\n    var rect = el.getBoundingClientRect();\r\n\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right\r\n      rect.right <= window.innerWidth\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Add overlay layer to the page\r\n   *\r\n   * @api private\r\n   * @method _addOverlayLayer\r\n   * @param {Object} targetElm\r\n   */\r\n  function _addOverlayLayer(targetElm) {\r\n    var overlayLayer = document.createElement('div'),\r\n        styleText = '',\r\n        self = this;\r\n\r\n    //set css class name\r\n    overlayLayer.className = 'introjs-overlay';\r\n\r\n    //check if the target element is body, we should calculate the size of overlay layer in a better way\r\n    if (!targetElm.tagName || targetElm.tagName.toLowerCase() === 'body') {\r\n      styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';\r\n      overlayLayer.style.cssText = styleText;\r\n    } else {\r\n      //set overlay layer position\r\n      var elementPosition = _getOffset(targetElm);\r\n      if (elementPosition) {\r\n        styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';\r\n        overlayLayer.style.cssText = styleText;\r\n      }\r\n    }\r\n\r\n    targetElm.appendChild(overlayLayer);\r\n\r\n    overlayLayer.onclick = function() {\r\n      if (self._options.exitOnOverlayClick === true) {\r\n        _exitIntro.call(self, targetElm);\r\n      }\r\n    };\r\n\r\n    window.setTimeout(function() {\r\n      styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';\r\n      overlayLayer.style.cssText = styleText;\r\n    }, 10);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Removes open hint (tooltip hint)\r\n   *\r\n   * @api private\r\n   * @method _removeHintTooltip\r\n   */\r\n  function _removeHintTooltip() {\r\n    var tooltip = document.querySelector('.introjs-hintReference');\r\n\r\n    if (tooltip) {\r\n      var step = tooltip.getAttribute('data-step');\r\n      tooltip.parentNode.removeChild(tooltip);\r\n      return step;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start parsing hint items\r\n   *\r\n   * @api private\r\n   * @param {Object} targetElm\r\n   * @method _startHint\r\n   */\r\n  function _populateHints(targetElm) {\r\n\r\n    this._introItems = [];\r\n\r\n    if (this._options.hints) {\r\n      _forEach(this._options.hints, function (hint) {\r\n        var currentItem = _cloneObject(hint);\r\n\r\n        if (typeof(currentItem.element) === 'string') {\r\n          //grab the element with given selector from the page\r\n          currentItem.element = document.querySelector(currentItem.element);\r\n        }\r\n\r\n        currentItem.hintPosition = currentItem.hintPosition || this._options.hintPosition;\r\n        currentItem.hintAnimation = currentItem.hintAnimation || this._options.hintAnimation;\r\n\r\n        if (currentItem.element !== null) {\r\n          this._introItems.push(currentItem);\r\n        }\r\n      }.bind(this));\r\n    } else {\r\n      var hints = targetElm.querySelectorAll('*[data-hint]');\r\n\r\n      if (!hints || !hints.length) {\r\n        return false;\r\n      }\r\n\r\n      //first add intro items with data-step\r\n      _forEach(hints, function (currentElement) {\r\n        // hint animation\r\n        var hintAnimation = currentElement.getAttribute('data-hintanimation');\r\n\r\n        if (hintAnimation) {\r\n          hintAnimation = (hintAnimation === 'true');\r\n        } else {\r\n          hintAnimation = this._options.hintAnimation;\r\n        }\r\n\r\n        this._introItems.push({\r\n          element: currentElement,\r\n          hint: currentElement.getAttribute('data-hint'),\r\n          hintPosition: currentElement.getAttribute('data-hintposition') || this._options.hintPosition,\r\n          hintAnimation: hintAnimation,\r\n          tooltipClass: currentElement.getAttribute('data-tooltipclass'),\r\n          position: currentElement.getAttribute('data-position') || this._options.tooltipPosition\r\n        });\r\n      }.bind(this));\r\n    }\r\n\r\n    _addHints.call(this);\r\n\r\n    /* \r\n    todo:\r\n    these events should be removed at some point \r\n    */\r\n    DOMEvent.on(document, 'click', _removeHintTooltip, this, false);\r\n    DOMEvent.on(window, 'resize', _reAlignHints, this, true);\r\n  }\r\n\r\n  /**\r\n   * Re-aligns all hint elements\r\n   *\r\n   * @api private\r\n   * @method _reAlignHints\r\n   */\r\n  function _reAlignHints() {\r\n    _forEach(this._introItems, function (item) {\r\n      if (typeof(item.targetElement) === 'undefined') {\r\n        return;\r\n      }\r\n\r\n      _alignHintPosition.call(this, item.hintPosition, item.element, item.targetElement);\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n  * Get a queryselector within the hint wrapper\r\n  *\r\n  * @param {String} selector\r\n  * @return {NodeList|Array}\r\n  */\r\n  function _hintQuerySelectorAll(selector) {\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n    return (hintsWrapper) ? hintsWrapper.querySelectorAll(selector) : [];\r\n  }\r\n\r\n  /**\r\n   * Hide a hint\r\n   *\r\n   * @api private\r\n   * @method _hideHint\r\n   */\r\n  function _hideHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n    \r\n    _removeHintTooltip.call(this);\r\n\r\n    if (hint) {\r\n      _addClass(hint, 'introjs-hidehint');\r\n    }\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintCloseCallback) !== 'undefined') {\r\n      this._hintCloseCallback.call(this, stepId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Hide all hints\r\n   *\r\n   * @api private\r\n   * @method _hideHints\r\n   */\r\n  function _hideHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _hideHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Show all hints\r\n   *\r\n   * @api private\r\n   * @method _showHints\r\n   */\r\n  function _showHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    if (hints && hints.length) {\r\n      _forEach(hints, function (hint) {\r\n        _showHint.call(this, hint.getAttribute('data-step'));\r\n      }.bind(this));\r\n    } else {\r\n      _populateHints.call(this, this._targetElement);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show a hint\r\n   *\r\n   * @api private\r\n   * @method _showHint\r\n   */\r\n  function _showHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      _removeClass(hint, /introjs-hidehint/g);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes all hint elements on the page\r\n   * Useful when you want to destroy the elements and add them again (e.g. a modal or popup)\r\n   *\r\n   * @api private\r\n   * @method _removeHints\r\n   */\r\n  function _removeHints() {\r\n    var hints = _hintQuerySelectorAll('.introjs-hint');\r\n\r\n    _forEach(hints, function (hint) {\r\n      _removeHint.call(this, hint.getAttribute('data-step'));\r\n    }.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove one single hint element from the page\r\n   * Useful when you want to destroy the element and add them again (e.g. a modal or popup)\r\n   * Use removeHints if you want to remove all elements.\r\n   *\r\n   * @api private\r\n   * @method _removeHint\r\n   */\r\n  function _removeHint(stepId) {\r\n    var hint = _hintQuerySelectorAll('.introjs-hint[data-step=\"' + stepId + '\"]')[0];\r\n\r\n    if (hint) {\r\n      hint.parentNode.removeChild(hint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add all available hints to the page\r\n   *\r\n   * @api private\r\n   * @method _addHints\r\n   */\r\n  function _addHints() {\r\n    var self = this;\r\n\r\n    var hintsWrapper = document.querySelector('.introjs-hints');\r\n\r\n    if (hintsWrapper === null) {\r\n      hintsWrapper = document.createElement('div');\r\n      hintsWrapper.className = 'introjs-hints';\r\n    }\r\n\r\n    /**\r\n    * Returns an event handler unique to the hint iteration\r\n    * \r\n    * @param {Integer} i\r\n    * @return {Function}\r\n    */\r\n    var getHintClick = function (i) {\r\n      return function(e) {\r\n        var evt = e ? e : window.event;\r\n        \r\n        if (evt.stopPropagation) {\r\n          evt.stopPropagation();\r\n        }\r\n\r\n        if (evt.cancelBubble !== null) {\r\n          evt.cancelBubble = true;\r\n        }\r\n\r\n        _showHintDialog.call(self, i);\r\n      };\r\n    };\r\n\r\n    _forEach(this._introItems, function(item, i) {\r\n      // avoid append a hint twice\r\n      if (document.querySelector('.introjs-hint[data-step=\"' + i + '\"]')) {\r\n        return;\r\n      }\r\n\r\n      var hint = document.createElement('a');\r\n      _setAnchorAsButton(hint);\r\n\r\n      hint.onclick = getHintClick(i);\r\n\r\n      hint.className = 'introjs-hint';\r\n\r\n      if (!item.hintAnimation) {\r\n        _addClass(hint, 'introjs-hint-no-anim');\r\n      }\r\n\r\n      // hint's position should be fixed if the target element's position is fixed\r\n      if (_isFixed(item.element)) {\r\n        _addClass(hint, 'introjs-fixedhint');\r\n      }\r\n\r\n      var hintDot = document.createElement('div');\r\n      hintDot.className = 'introjs-hint-dot';\r\n      var hintPulse = document.createElement('div');\r\n      hintPulse.className = 'introjs-hint-pulse';\r\n\r\n      hint.appendChild(hintDot);\r\n      hint.appendChild(hintPulse);\r\n      hint.setAttribute('data-step', i);\r\n\r\n      // we swap the hint element with target element\r\n      // because _setHelperLayerPosition uses `element` property\r\n      item.targetElement = item.element;\r\n      item.element = hint;\r\n\r\n      // align the hint position\r\n      _alignHintPosition.call(this, item.hintPosition, hint, item.targetElement);\r\n\r\n      hintsWrapper.appendChild(hint);\r\n    }.bind(this));\r\n\r\n    // adding the hints wrapper\r\n    document.body.appendChild(hintsWrapper);\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintsAddedCallback) !== 'undefined') {\r\n      this._hintsAddedCallback.call(this);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aligns hint position\r\n   *\r\n   * @api private\r\n   * @method _alignHintPosition\r\n   * @param {String} position\r\n   * @param {Object} hint\r\n   * @param {Object} element\r\n   */\r\n  function _alignHintPosition(position, hint, element) {\r\n    // get/calculate offset of target element\r\n    var offset = _getOffset.call(this, element);\r\n    var iconWidth = 20;\r\n    var iconHeight = 20;\r\n\r\n    // align the hint element\r\n    switch (position) {\r\n      default:\r\n      case 'top-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'top-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n      case 'bottom-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'bottom-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'middle-left':\r\n        hint.style.left = offset.left + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-right':\r\n        hint.style.left = (offset.left + offset.width - iconWidth) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'middle-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + (offset.height - iconHeight) / 2) + 'px';\r\n        break;\r\n      case 'bottom-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = (offset.top + offset.height - iconHeight) + 'px';\r\n        break;\r\n      case 'top-middle':\r\n        hint.style.left = (offset.left + (offset.width - iconWidth) / 2) + 'px';\r\n        hint.style.top = offset.top + 'px';\r\n        break;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggers when user clicks on the hint element\r\n   *\r\n   * @api private\r\n   * @method _showHintDialog\r\n   * @param {Number} stepId\r\n   */\r\n  function _showHintDialog(stepId) {\r\n    var hintElement = document.querySelector('.introjs-hint[data-step=\"' + stepId + '\"]');\r\n    var item = this._introItems[stepId];\r\n\r\n    // call the callback function (if any)\r\n    if (typeof (this._hintClickCallback) !== 'undefined') {\r\n      this._hintClickCallback.call(this, hintElement, item, stepId);\r\n    }\r\n\r\n    // remove all open tooltips\r\n    var removedStep = _removeHintTooltip.call(this);\r\n\r\n    // to toggle the tooltip\r\n    if (parseInt(removedStep, 10) === stepId) {\r\n      return;\r\n    }\r\n\r\n    var tooltipLayer = document.createElement('div');\r\n    var tooltipTextLayer = document.createElement('div');\r\n    var arrowLayer = document.createElement('div');\r\n    var referenceLayer = document.createElement('div');\r\n\r\n    tooltipLayer.className = 'introjs-tooltip';\r\n\r\n    tooltipLayer.onclick = function (e) {\r\n      //IE9 & Other Browsers\r\n      if (e.stopPropagation) {\r\n        e.stopPropagation();\r\n      }\r\n      //IE8 and Lower\r\n      else {\r\n        e.cancelBubble = true;\r\n      }\r\n    };\r\n\r\n    tooltipTextLayer.className = 'introjs-tooltiptext';\r\n\r\n    var tooltipWrapper = document.createElement('p');\r\n    tooltipWrapper.innerHTML = item.hint;\r\n\r\n    var closeButton = document.createElement('a');\r\n    closeButton.className = this._options.buttonClass;\r\n    closeButton.setAttribute('role', 'button');\r\n    closeButton.innerHTML = this._options.hintButtonLabel;\r\n    closeButton.onclick = _hideHint.bind(this, stepId);\r\n\r\n    tooltipTextLayer.appendChild(tooltipWrapper);\r\n    tooltipTextLayer.appendChild(closeButton);\r\n\r\n    arrowLayer.className = 'introjs-arrow';\r\n    tooltipLayer.appendChild(arrowLayer);\r\n\r\n    tooltipLayer.appendChild(tooltipTextLayer);\r\n\r\n    // set current step for _placeTooltip function\r\n    this._currentStep = hintElement.getAttribute('data-step');\r\n\r\n    // align reference layer position\r\n    referenceLayer.className = 'introjs-tooltipReferenceLayer introjs-hintReference';\r\n    referenceLayer.setAttribute('data-step', hintElement.getAttribute('data-step'));\r\n    _setHelperLayerPosition.call(this, referenceLayer);\r\n\r\n    referenceLayer.appendChild(tooltipLayer);\r\n    document.body.appendChild(referenceLayer);\r\n\r\n    //set proper position\r\n    _placeTooltip.call(this, hintElement, tooltipLayer, arrowLayer, null, true);\r\n  }\r\n\r\n  /**\r\n   * Get an element position on the page\r\n   * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966\r\n   *\r\n   * @api private\r\n   * @method _getOffset\r\n   * @param {Object} element\r\n   * @returns Element's position info\r\n   */\r\n  function _getOffset(element) {\r\n    var body = document.body;\r\n    var docEl = document.documentElement;\r\n    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;\r\n    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;\r\n    var x = element.getBoundingClientRect();\r\n    return {\r\n      top: x.top + scrollTop,\r\n      width: x.width,\r\n      height: x.height,\r\n      left: x.left + scrollLeft\r\n    };\r\n  }\r\n\r\n  /**\r\n  * Find the nearest scrollable parent\r\n  * copied from https://stackoverflow.com/questions/35939886/find-first-scrollable-parent\r\n  *\r\n  * @param Element element\r\n  * @return Element\r\n  */\r\n  function _getScrollParent(element) {\r\n    var style = window.getComputedStyle(element);\r\n    var excludeStaticParent = (style.position === \"absolute\");\r\n    var overflowRegex = /(auto|scroll)/;\r\n\r\n    if (style.position === \"fixed\") return document.body;\r\n    \r\n    for (var parent = element; (parent = parent.parentElement);) {\r\n      style = window.getComputedStyle(parent);\r\n      if (excludeStaticParent && style.position === \"static\") {\r\n        continue;\r\n      }\r\n      if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) return parent;\r\n    }\r\n\r\n    return document.body;\r\n  }\r\n\r\n  /**\r\n  * scroll a scrollable element to a child element\r\n  *\r\n  * @param Element parent\r\n  * @param Element element\r\n  * @return Null\r\n  */\r\n  function _scrollParentToElement (parent, element) {\r\n    parent.scrollTop = element.offsetTop - parent.offsetTop;\r\n  }\r\n\r\n  /**\r\n   * Gets the current progress percentage\r\n   *\r\n   * @api private\r\n   * @method _getProgress\r\n   * @returns current progress percentage\r\n   */\r\n  function _getProgress() {\r\n    // Steps are 0 indexed\r\n    var currentStep = parseInt((this._currentStep + 1), 10);\r\n    return ((currentStep / this._introItems.length) * 100);\r\n  }\r\n\r\n  /**\r\n   * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1\r\n   * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically\r\n   *\r\n   * @param obj1\r\n   * @param obj2\r\n   * @returns obj3 a new object based on obj1 and obj2\r\n   */\r\n  function _mergeOptions(obj1,obj2) {\r\n    var obj3 = {},\r\n      attrname;\r\n    for (attrname in obj1) { obj3[attrname] = obj1[attrname]; }\r\n    for (attrname in obj2) { obj3[attrname] = obj2[attrname]; }\r\n    return obj3;\r\n  }\r\n\r\n  var introJs = function (targetElm) {\r\n    var instance;\r\n\r\n    if (typeof (targetElm) === 'object') {\r\n      //Ok, create a new instance\r\n      instance = new IntroJs(targetElm);\r\n\r\n    } else if (typeof (targetElm) === 'string') {\r\n      //select the target element with query selector\r\n      var targetElement = document.querySelector(targetElm);\r\n\r\n      if (targetElement) {\r\n        instance = new IntroJs(targetElement);\r\n      } else {\r\n        throw new Error('There is no element with given selector.');\r\n      }\r\n    } else {\r\n      instance = new IntroJs(document.body);\r\n    }\r\n    // add instance to list of _instances\r\n    // passing group to _stamp to increment\r\n    // from 0 onward somewhat reliably\r\n    introJs.instances[ _stamp(instance, 'introjs-instance') ] = instance;\r\n\r\n    return instance;\r\n  };\r\n\r\n  /**\r\n   * Current IntroJs version\r\n   *\r\n   * @property version\r\n   * @type String\r\n   */\r\n  introJs.version = VERSION;\r\n\r\n  /**\r\n  * key-val object helper for introJs instances\r\n  *\r\n  * @property instances\r\n  * @type Object\r\n  */\r\n  introJs.instances = {};\r\n\r\n  //Prototype\r\n  introJs.fn = IntroJs.prototype = {\r\n    clone: function () {\r\n      return new IntroJs(this);\r\n    },\r\n    setOption: function(option, value) {\r\n      this._options[option] = value;\r\n      return this;\r\n    },\r\n    setOptions: function(options) {\r\n      this._options = _mergeOptions(this._options, options);\r\n      return this;\r\n    },\r\n    start: function (group) {\r\n      _introForElement.call(this, this._targetElement, group);\r\n      return this;\r\n    },\r\n    goToStep: function(step) {\r\n      _goToStep.call(this, step);\r\n      return this;\r\n    },\r\n    addStep: function(options) {\r\n      if (!this._options.steps) {\r\n        this._options.steps = [];\r\n      }\r\n\r\n      this._options.steps.push(options);\r\n\r\n      return this;\r\n    },\r\n    addSteps: function(steps) {\r\n      if (!steps.length) return;\r\n\r\n      for(var index = 0; index < steps.length; index++) {\r\n        this.addStep(steps[index]);\r\n      }\r\n\r\n      return this;\r\n    },\r\n    goToStepNumber: function(step) {\r\n      _goToStepNumber.call(this, step);\r\n\r\n      return this;\r\n    },\r\n    nextStep: function() {\r\n      _nextStep.call(this);\r\n      return this;\r\n    },\r\n    previousStep: function() {\r\n      _previousStep.call(this);\r\n      return this;\r\n    },\r\n    exit: function(force) {\r\n      _exitIntro.call(this, this._targetElement, force);\r\n      return this;\r\n    },\r\n    refresh: function() {\r\n      _refresh.call(this);\r\n      return this;\r\n    },\r\n    onbeforechange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforechange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    onchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onchange was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onafterchange: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introAfterChangeCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onafterchange was not a function');\r\n      }\r\n      return this;\r\n    },\r\n    oncomplete: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introCompleteCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for oncomplete was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintsadded: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintsAddedCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintsadded was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclick: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintClickCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclick was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onhintclose: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._hintCloseCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onhintclose was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onskip: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introSkipCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onskip was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    onbeforeexit: function(providedCallback) {\r\n      if (typeof (providedCallback) === 'function') {\r\n        this._introBeforeExitCallback = providedCallback;\r\n      } else {\r\n        throw new Error('Provided callback for onbeforeexit was not a function.');\r\n      }\r\n      return this;\r\n    },\r\n    addHints: function() {\r\n      _populateHints.call(this, this._targetElement);\r\n      return this;\r\n    },\r\n    hideHint: function (stepId) {\r\n      _hideHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    hideHints: function () {\r\n      _hideHints.call(this);\r\n      return this;\r\n    },\r\n    showHint: function (stepId) {\r\n      _showHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHints: function () {\r\n      _showHints.call(this);\r\n      return this;\r\n    },\r\n    removeHints: function () {\r\n      _removeHints.call(this);\r\n      return this;\r\n    },\r\n    removeHint: function (stepId) {\r\n      _removeHint.call(this, stepId);\r\n      return this;\r\n    },\r\n    showHintDialog: function (stepId) {\r\n      _showHintDialog.call(this, stepId);\r\n      return this;\r\n    }\r\n  };\r\n\r\n  return introJs;\r\n});\r\n\n/**\r\n * Guided Tour to explain the UI\r\n * \r\n * @author Helge Stallkamp\r\n */\r\n\r\n\r\ndefine('tour/tours',['lib/intro', 'vc', 'hint', 'menu', 'vc/doc', 'vc/docgroup'],\r\n       function(introClass, vcClass, hintClass, menuClass, docClass, docGroup) {\r\n\r\n  //needed for localization of labels and contents of the tour\r\n  const loc   = KorAP.Locale;\r\n\r\n  //labels for nextStep, previousStep, done and abort\r\n  loc.TOUR_lskip = loc.TOUR_lskip || \"Abort\";\r\n  loc.TOUR_lprev = loc.TOUR_lprev || \"Back\";\r\n  loc.TOUR_lnext = loc.TOUR_lnext || \"Next\";\r\n  loc.TOUR_ldone = loc.TOUR_ldone || \"Done\";\r\n  loc.TOUR_ldoneSearch = loc.TOUR_ldoneSearch || \"Search\";\r\n  \r\n  //localization guided tour gTstartSearch\r\n  loc.TOUR_welc = loc.TOUR_welc || \"<span class='tgreeting'> Welcome to our guided tour!</span>\" +\r\n  \t\t                           \"<p class='pfirstStep'> This tour should give you a quick introduction to KorAP. \" +\r\n  \t\t                           \"We lead you step by step through an example. </p>\"; \r\n  loc.TOUR_sear1 = loc.TOUR_sear1 || \"Input field for the query, for example the search for '\" +  loc.TOUR_Qexample + \"'.\";\r\n  loc.TOUR_searAnnot = loc.TOUR_searAnnot || \"Annotation helper\";\r\n  loc.TOUR_annotAss =  loc.TOUR_annotAss || \"The assistant displays the annotations of the different layers and helps to formulate queries.\";\r\n  loc.TOUR_vccho1 = loc.TOUR_vccho1 || \"Choose corpus\";  \r\n  loc.TOUR_vccho2 = loc.TOUR_vccho2 || \"Define your corpus here.\";\r\n  loc.TOUR_vcStat1 = loc.TOUR_vcStat1 || \"Click here to display corpus statistic.\";\r\n  loc.TOUR_vcStat2 = loc.TOUR_vcStat2 || \"Corpus statistic\";\r\n  loc.TOUR_qlfield = loc.TOUR_qlfield|| \"Selection of the query language: You can use KorAP with different query languages.\";  \r\n  loc.TOUR_help = loc.TOUR_help || \"Help and information about KorAP.\";\r\n  loc.TOUR_glimpse = loc.TOUR_glimpse || \"Select this to show only the first hits in undefined order.\";\r\n  loc.TOUR_seargo = loc.TOUR_seargo || \"Start the search\";\r\n\r\n  //localization guided Tour gTshowResults\r\n  loc.TOUR_kwic = loc.TOUR_kwic || \"KWIC result (keyword in context)\";\r\n  loc.TOUR_snippet = loc.TOUR_snippet ||  \"Click on a match to show a larger snippet.\";\r\n  loc.TOUR_snippetb = loc.TOUR_snippetb || \"Snippet\";\r\n  loc.TOUR_metadatab =  loc.TOUR_metadatab || \"Display of metadata\";\r\n  loc.TOUR_metadata = loc.TOUR_metadata || \"Metadata\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Display of token annotations\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP supports multiple annotations.\";\r\n  loc.TOUR_treeb = loc.TOUR_treeb || \"Display further annotations\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Further annotations can be displayed as tree and arch views.\"\r\n  loc.TOUR_tourdone = loc.TOUR_tourdone || \"Have fun with KorAP!\";\r\n  \r\n  //localization of button labels\r\n  let labelOpts= {\r\n      'skipLabel': loc.TOUR_lskip, \r\n      'prevLabel': loc.TOUR_lprev,\r\n      'nextLabel': loc.TOUR_lnext,\r\n      'doneLabel': loc.TOUR_ldone,\r\n      'showStepNumbers': false\r\n  };\r\n  \r\n  //usability options of tours\r\n  let usabilityOpts ={\r\n      'showBullets': false,\r\n      'overlayOpacity': 0.7,\r\n      'exitOnOverlayClick': false,\r\n      'disableInteraction': true,      \r\n      'hideNext': true,\r\n      'hidePrev': true\r\n  };\r\n  \r\n  var doe = document;\r\n\r\n  return{\r\n\r\n    /** \r\n     * Guided Tour gTstartSearch: Explains the search functionality\r\n     */\r\n    gTstartSearch:function(elparam){\r\n      let intro = introClass();\r\n      intro.setOptions(labelOpts);\r\n      intro.setOption('tooltipClass', 'gTstartSearch');\r\n      /*\r\n       * Sets button labels for the last step of the tour\r\n       * Because Kalamar is a multipage webapplication, this tours starts by\r\n       * completion the gTshowResults Tour. Therefore the label of the done button changed.\r\n        */\r\n      intro.setOption('doneLabel', loc.TOUR_ldoneSearch );\r\n      intro.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n\r\n      let input = doe.querySelector(\"#q-field\");\r\n      input.value=\"\";\r\n      \r\n\r\n      //steps of the example tour\r\n      let Steps =[\r\n        {\r\n          intro: loc.TOUR_welc,\r\n        },\r\n        {\r\n          element: '#q-field',\r\n          intro: loc.TOUR_sear1,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: '#hint',\r\n          intro: loc.TOUR_searAnnot,\r\n          position: 'bottom'\r\n        },\r\n        {\r\n          element: doe.querySelector(\"#hint > .menu.hint\"),\r\n          intro: loc.TOUR_annotAss,\r\n          position: 'bottom',\r\n          }, \r\n        {\r\n          element:'#vc-choose',\r\n          intro: loc.TOUR_vccho1,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element:'#vc-view',\r\n          intro: loc.TOUR_vccho2,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element: doe.querySelector('.statistic'),\r\n          intro: loc.TOUR_vcStat1,\r\n          position: \"left\",\r\n        },\r\n        {\r\n          element: doe.querySelector('.stattable'),\r\n          intro: loc.TOUR_vcStat2,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: doe.querySelector('#ql-field').parentNode,\r\n          intro: loc.TOUR_qlfield,\r\n          position: \"bottom\",\r\n        },  \r\n        {\r\n          element:'#glimpse',\r\n          intro: loc.TOUR_glimpse,\r\n          position: \"bottom\",\r\n        }, \r\n        {\r\n          element:'#view-tutorial',\r\n          intro: loc.TOUR_help,\r\n          position: \"bottom\",\r\n        },\r\n        {\r\n          element: '#qsubmit',\r\n          intro: loc.TOUR_seargo,\r\n          position: \"bottom\",\r\n        },\r\n        ];\r\n\r\n      //pass in the Steps array created earlier\r\n      intro.setOptions({steps: Steps});      \r\n      this.testPrerequ(Steps, intro);\r\n\r\n      //changes before executing the single steps\r\n      intro.onbeforechange(function(targetedElement){\r\n        switch(targetedElement.id){\r\n        case \"q-field\": \r\n          /* \r\n           * TODO:\r\n           * #268 is not merged at the time beeing: \r\n           * introJs.currentStep() merge requested https://github.com/usablica/intro.js/pull/268/files\r\n           */\r\n            targetedElement.value = loc.TOUR_Qexample;\r\n          break;\r\n        case \"vc-view\":  \r\n          vchoo = doe.querySelector(\"#vc-choose\");\r\n          vcv = doe.querySelector(\"#vc-view\");  \r\n          KorAP._delete.apply(KorAP.vc.root());\r\n    \r\n          KorAP.vc.fromJson(loc.TOUR_vcQuery);\r\n          if(!(vcv.querySelector(\".active\"))){\r\n            vchoo.click();\r\n            /*\r\n             * Intro.js caches elements at the beginning, so element and position has to be set again.\r\n             */\r\n            intro._introItems[6].element = doe.querySelector('.statistic');\r\n            intro._introItems[6].position = \"left\";\r\n          }   \r\n          break;   \r\n          \r\n        } \r\n        \r\n        if(this._currentStep == 7){\r\n          let statbut = doe.querySelector('.statistic');\r\n          statbut.click();\r\n          intro._introItems[7].element = doe.querySelector(\".stattable\");\r\n          intro._introItems[7].position = \"bottom\";\r\n        }\r\n      });\r\n\r\n      intro.onbeforeexit(function(){\r\n          if(KorAP.Hint.active() && KorAP.Hint.active().dontHide){\r\n            KorAP.Hint.unshow();\r\n          }\r\n        });\r\n      \r\n      intro.onchange(function(targetElement) {\r\n        var that = this; \r\n        switch(this._currentStep){\r\n        //hides Hint if back button is pressed \r\n        case 2:   \r\n          if(KorAP.Hint.active()){\r\n          KorAP.Hint.unshow(); \r\n          }\r\n          break;\r\n        case 3:\r\n          KorAP.Hint.show(false);\r\n          KorAP.Hint.active().dontHide = true;\r\n          intro._introItems[3].element = doe.querySelector(\".menu.roll.hint\");\r\n          intro._introItems[3].position = doe.querySelector(\"bottom\");\r\n          break;\r\n        case 4: \r\n          KorAP.Hint.unshow();      \r\n          break;\r\n        }\r\n        });  \r\n      \r\n      // Execute at the end of the tour (By clicking at the done-Button)\r\n      intro.oncomplete(function(){\r\n        KorAP.session.set(\"tour\", true);\r\n        doe.getElementById(\"qsubmit\").click();\r\n      });\r\n\r\n      return intro;\r\n    },\r\n\r\n\r\n    /* Guided Tour to explain the different views of the results */     \r\n    gTshowResults: function(elparam){     \r\n    \r\n      let tourR = introClass();\r\n      tourR.setOptions(usabilityOpts);\r\n      \r\n      //for testing purposes\r\n      if(elparam){\r\n        doe = elparam;\r\n      }\r\n      let StepsSR = [\r\n        //Step 1, intro_item 0\r\n        {\r\n          element: '#search',\r\n          intro: loc.TOUR_kwic ,\r\n          position: \"auto\",\r\n        },\r\n        //Step 2, intro_item 1 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippet,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 3, intro_item 2 \r\n        {\r\n          element: doe.querySelector(\"#search > ol > li\"),\r\n          intro: loc.TOUR_snippetb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 4, intro_item 3\r\n        {\r\n          element: doe.querySelector(\".action > .metatable\"),\r\n          intro: loc.TOUR_metadatab,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 5, intro_item 4\r\n        {\r\n          element: doe.querySelector(\".view.metatable\"),\r\n          intro: loc.TOUR_metadata,\r\n          position: \"auto\",\r\n        },\r\n        //Step 6, intro_item 5\r\n        {   \r\n          element: doe.querySelector(\".action > .info\"),\r\n          intro: loc.TOUR_tokenb,\r\n          position: \"bottom\",\r\n        },\r\n        //Step 7, intro_item 6\r\n        {   \r\n          element: doe.querySelector(\".view.tokentable\"),\r\n          intro: loc.TOUR_token,\r\n          position: \"auto\",\r\n        },\r\n        //Step 8, intro_item 7\r\n        {     \r\n          element: doe.querySelector(\".tree\"),\r\n          intro: loc.TOUR_treeb,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 9, intro_item 8\r\n        {     \r\n          element: doe.querySelector(\".view.relations\"),\r\n          intro: loc.TOUR_tree,\r\n          position: \"bottom\",\r\n        }, \r\n        //Step 10, intro_item 9\r\n        {     \r\n          intro: loc.TOUR_tourdone, \r\n        }    \r\n        ]\r\n      \r\n        tourR.setOptions({steps:StepsSR});\r\n        tourR.setOptions(labelOpts);\r\n     \r\n        tourR.onbeforeexit(function(){\r\n          KorAP.session.set(\"tour\", false);\r\n        });\r\n        //See also: https://introjs.com/docs/intro/options/\r\n        tourR.setOption('scrollToElement', true);\r\n        tourR.setOption('scrollTo','tooltip');\r\n        this.testPrerequ(StepsSR, tourR);\r\n      \r\n        //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n        tourR.onbeforechange(function(targetedElement){\r\n          \r\n        if(this._currentStep == 1){\r\n          KorAP.session.set(\"tour\", false);\r\n        }\r\n        \r\n        if(this._currentStep == 2){\r\n          doe.querySelector(\"#search > ol > li\").click();\r\n          tourR._introItems[3].element = doe.querySelector('.action > .metatable');\r\n          tourR._introItems[3].position = \"bottom\";\r\n        }\r\n  \r\n        if(this._currentStep == 4){\r\n          doe.querySelector(\".metatable\").click();\r\n          tourR._introItems[4].element = doe.querySelector('.view.metatable');\r\n          tourR._introItems[5].element = doe.querySelector('.action > .info');\r\n          tourR._introItems[5].position = \"bottom\";          \r\n        }   \r\n     \r\n        if(this._currentStep == 6){\r\n            doe.querySelector(\".info\").click();\r\n            tourR._introItems[6].element = doe.querySelector('.view.tokentable');\r\n            tourR._introItems[7].element = doe.querySelector('.tree');\r\n            tourR._introItems[7].position = \"bottom\";\r\n          }\r\n      \r\n        if(this._currentStep == 8){\r\n          doe.querySelector(\".tree\").click();\r\n          let collect =  document.querySelectorAll(\".button-group-list\")[0].querySelectorAll('li');\r\n          for(let i = 0;  i < collect.length; i++){\r\n            if (collect[i].innerText == loc.TOUR_Relations) {\r\n              collect[i].click();\r\n              break;\r\n            }\r\n          }\r\n          tourR._introItems[8].element = doe.querySelector(\".view.relations\");\r\n        }\r\n      });       \r\n  \r\n      return tourR;\r\n    },  \r\n    /* \r\n     * The total number of steps and the text of the tooltips are needed for jasmine testing.\r\n     */\r\n    testPrerequ: function(steps, tour){\r\n      //TODO see also: introJS.totalSteps() merge requested: //github.com/usablica/intro.js/pull/268/files\r\n      let StepsT = steps;\r\n      let gtour = tour;      \r\n      gtour.stepCount = StepsT.length;\r\n\r\n      //Array of intro content needed for efficient testing\r\n      gtour.testIntros = [];\r\n\r\n      for(let i = 0; i< StepsT.length; i++){\r\n      gtour.testIntros.push(StepsT[i].intro);\r\n      }\r\n    },\r\n\r\n  }\r\n});\r\n\n\r\n\r\ndefine('plugin/service',[],function () {\r\n\r\n  // Limit the supported sandbox permissions, especially\r\n  // to disallow 'same-origin'.\r\n  let allowed = {\r\n    \"scripts\" : 1,\r\n    \"presentation\" : 1,\r\n    \"forms\": 1,\r\n    \"downloads-without-user-activation\" : 1,\r\n    \"downloads\" : 1\r\n  };\r\n\r\n  return {\r\n    create : function (data) {\r\n      return Object.create(this)._init(data);\r\n    },\r\n\r\n    // Initialize service\r\n    _init : function (data) {\r\n      if (!data || !data[\"name\"] || !data[\"src\"] || !data[\"id\"])\r\n        throw Error(\"Service not well defined\");\r\n\r\n      this.name = data[\"name\"];\r\n      this.src = data[\"src\"];\r\n      this.id = data[\"id\"];\r\n      this.desc = data[\"desc\"];\r\n      let _perm = new Set();\r\n      let perm = data[\"permissions\"];\r\n      if (perm && Array.isArray(perm)) {\r\n        perm.forEach(function (p) {\r\n          if (p in allowed) {\r\n            _perm.add(p)\r\n          }\r\n          else {\r\n            KorAP.log(0, \"Requested permission not allowed\");\r\n          }\r\n        });\r\n      };\r\n\r\n      this._perm = _perm;\r\n      \r\n      // There is no close method defined yet\r\n      if (!this.close) {\r\n        this.close = function () {\r\n          this._closeIframe();\r\n        }\r\n      }\r\n      \r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the service as embedded in the panel\r\n     */\r\n    load : function () {\r\n      if (this._load)\r\n        return this._load;\r\n\r\n      if (window.location.protocol == 'https:' &&\r\n          this.src.toLowerCase().indexOf('https:') != 0) {\r\n        KorAP.log(0, \"Service endpoint is insecure\");\r\n        return;\r\n      };\r\n\r\n      // Spawn new iframe\r\n      let e = document.createElement('iframe');\r\n      e.setAttribute('allowTransparency',\"true\");\r\n      e.setAttribute('frameborder', 0);\r\n      // Allow forms in Plugins\r\n      e.setAttribute('sandbox', Array.from(this._perm).sort().map(function(i){ return \"allow-\"+i }).join(\" \"));\r\n      e.style.height = '0px';\r\n      e.setAttribute('name', this.id);\r\n      e.setAttribute('src', this.src);\r\n      \r\n      this._load = e;\r\n      return e;\r\n    },\r\n\r\n    /**\r\n     * Send a message to the embedded service.\r\n     */\r\n    sendMsg : function (d) {\r\n      let iframe = this.load();\r\n      iframe.contentWindow.postMessage(\r\n        d,\r\n        '*'\r\n      ); // TODO: Fix origin\r\n    },\r\n\r\n    // onClose : function () {},\r\n\r\n    /**\r\n     * Close the service iframe.\r\n     */\r\n    _closeIframe : function () {\r\n      var e = this._load;\r\n      if (e && e.parentNode) {\r\n        e.parentNode.removeChild(e);\r\n      };\r\n      this._load = null;\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered widgets (iframes) from\r\n * foreign services.\r\n * The widget component represents a single iframe and is\r\n * implemented as a view object.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/widget',[\"view\",\"plugin/service\",\"util\"], function (viewClass, serviceClass) {\r\n\r\n  return {\r\n\r\n    /**\r\n     * Create new widget\r\n     */\r\n    create : function (data) {\r\n      return Object.create(viewClass)._init(['widget']).upgradeTo(serviceClass)._init(data).upgradeTo(this)._init();\r\n    },\r\n\r\n    // Initialize widget\r\n    _init : function () {\r\n      this.isWidget = true;\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * The element of the widget as embedded in the view\r\n     */\r\n    show : function () {\r\n\r\n      if (this._load) {\r\n        if (this._el)\r\n          this._el.classList.add('show');\r\n        return this._load;\r\n      }\r\n\r\n      let obj = this.load();\r\n      this._load.classList.add(\"widget\", \"show\");\r\n      obj.setAttribute('loading', 'lazy');\r\n\r\n      // Per default there should at least be a button\r\n      // for settings, if the plugin requires settings.\r\n      // Otherwise a button indicating this is a plugin\r\n      // is a nice idea as well.\r\n      \r\n      this.actions.add(\r\n        this.name, {'cls':['button-icon', 'plugin']}, function (e) {\r\n\r\n          // Temporary\r\n          let str = this.name;\r\n          if (this.desc !== undefined) {\r\n            str += \"\\n\\n\" + this.desc;\r\n          };\r\n          window.alert(str);\r\n      }.bind(this));\r\n      \r\n      return obj;\r\n    },\r\n\r\n    // Resize iframe\r\n    resize : function (data) {\r\n      this.show().style.height = data.height + 'px';\r\n    },\r\n\r\n\r\n    // On closing the widget view\r\n    onClose : function () {\r\n      if (this._mgr) {\r\n        this._mgr._closeService(this.id);\r\n        this._mgr = undefined;\r\n      };\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * Create a state object, that can have a single value\r\n * (mostly boolean) and multiple objects associated to it.\r\n * Whenever the state changes, all objects are informed\r\n * by their setState() method of the value change.\r\n *\r\n * @author Nils Diewald\r\n */\r\n/*\r\n * TODO:\r\n *   Require names for states, that should be quite short, so they\r\n *   can easily be serialized and kept between page turns (via cookie\r\n *   and/or query param)\r\n */\r\n\r\n\r\ndefine('state',[],function () {\r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function (value) {\r\n      return Object.create(this)._init(value);\r\n    },\r\n\r\n\r\n    // Initialize\r\n    _init : function (values) {\r\n      const t = this;\r\n      t._assoc = [];\r\n      if (values == undefined) {\r\n        t.values = [false,true];\r\n      }\r\n      else if (Array.isArray(values)) {\r\n        t.values = values;\r\n      }\r\n      else {\r\n        t.values = [values];\r\n      }\r\n      t.value = t.values[0];\r\n      return t;\r\n    },\r\n\r\n\r\n    /**\r\n     * Associate the state with some objects.\r\n     */\r\n    associate : function (obj) {\r\n\r\n      // Check if the object has a setState() method\r\n      if (obj.hasOwnProperty(\"setState\")) {\r\n        this._assoc.push(obj);\r\n        obj.setState(this.value);\r\n      } else {\r\n        console.log(\"Object \" + obj + \" has no setState() method\");\r\n      }\r\n    },\r\n\r\n\r\n    /**\r\n     * Set the state to a certain value.\r\n     * This will set the state to all associated objects as well.\r\n     */\r\n    set : function (value) {\r\n      if (value != this.value) {\r\n        this.value = value;\r\n        this._assoc.forEach(i => i.setState(value));\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the state value\r\n     */\r\n    get : function () {\r\n      return this.value;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the number of associated objects\r\n     */\r\n    associates : function () {\r\n      return this._assoc.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Clear all associated objects\r\n     */\r\n    clear : function () {\r\n      return this._assoc = [];\r\n    },\r\n\r\n\r\n    /**\r\n     * Roll to the next value.\r\n     * This may be used for toggling.\r\n     */\r\n    roll : function () {\r\n      let next = 0;\r\n      for (let i = 0; i < this.values.length - 1; i++) {\r\n        if (this.value == this.values[i]) {\r\n          next = i+1;\r\n          break;\r\n        };\r\n      };\r\n      this.set(this.values[next]);\r\n    }\r\n  }\r\n});\r\n\n/**\r\n * The plugin system is based\r\n * on registered services (iframes) from\r\n * foreign services.\r\n * The server component spawns new iframes and\r\n * listens to them.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\n\r\ndefine('plugin/server',['plugin/widget', 'plugin/service', 'state', 'util'], function (widgetClass, serviceClass, stateClass) {\r\n\r\n  KorAP.Panel = KorAP.Panel || {};\r\n\r\n  // Contains all servicess to address with\r\n  // messages to them\r\n  var services = {};\r\n  var plugins  = {};\r\n\r\n  // TODO:\r\n  //   These should better be panels and every panel\r\n  //   has a buttonGroup\r\n\r\n  // List of panels with dynamic buttons, i.e.\r\n  // panels that may occur multiple times.\r\n  var buttons = {\r\n    match : []\r\n  };\r\n\r\n  // List of panels with static buttons, i.e.\r\n  // panels that occur only once.\r\n  var buttonsSingle = {\r\n    query : [],\r\n    result : []\r\n  } \r\n  \r\n  // This is a counter to limit acceptable incoming messages\r\n  // to a certain amount. For every message, this counter will\r\n  // be decreased (down to 0), for every second this will be\r\n  // increased (up to 100).\r\n  // Once a widget surpasses the limit, it will be killed\r\n  // and called suspicious.\r\n  var maxMessages = 100;\r\n  var limits = {};\r\n\r\n  // TODO:\r\n  //   It may be useful to establish a watcher that pings\r\n  //   all widgets every second to see if it is still alive,\r\n  //   otherwise kill\r\n  \r\n  // Load Plugin server\r\n  return {\r\n\r\n    /**\r\n     * Create new plugin management system\r\n     */\r\n    create : function () {\r\n      return Object.create(this)._init();\r\n    },\r\n\r\n    /*\r\n     * Initialize the plugin manager\r\n     */\r\n    _init : function () {\r\n      return this;\r\n    },\r\n\r\n    /**\r\n     * Register a plugin described as a JSON object.\r\n     *\r\n     * This is work in progress.\r\n     *\r\n     * Example:\r\n     *\r\n     *   KorAP.Plugin.register({\r\n     *     'name' : 'CatContent',\r\n     *     'desc' : 'Some content about cats',\r\n     *     'about' : 'https://localhost:5678/',\r\n     *     'embed' : [{\r\n     *       'panel' : 'match',\r\n     *       'title' : loc.TRANSLATE,\r\n     *       'classes' : ['translate']\r\n     *       'onClick' : {\r\n     *         'action' : 'addWidget',\r\n     *         'template' : 'https://localhost:5678/?match={matchid}',\r\n     *       }\r\n     *     },{\r\n     *       'title' : 'glemm',\r\n     *       'panel' : 'query',\r\n     *       'onClick' : {\r\n     *         'action' : 'toggle',\r\n     *         'state' : 'glemm',\r\n     *         'service' : {\r\n     *           'id' : 'glemm',\r\n     *           'template' : 'https://localhost:5678/'\r\n     *         }\r\n     *       }\r\n     *     }]\r\n     *   });\r\n     *\r\n     */\r\n    register : function (obj) {\r\n      // TODO:\r\n      //   These fields need to be localized for display by a structure like\r\n      //   { de : { name : '..' }, en : { .. } }\r\n      var name = obj[\"name\"];\r\n\r\n      if (!name)\r\n        throw new Error(\"Missing name of plugin\");\r\n\r\n      var desc = obj[\"desc\"];\r\n      \r\n      // Register plugin by name\r\n      var plugin = plugins[name] = {\r\n        name : name,\r\n        desc : desc,\r\n        about : obj[\"about\"],\r\n        widgets : [],\r\n        services : []\r\n      };\r\n\r\n      if (typeof obj[\"embed\"] !== 'object')\r\n        throw new Error(\"Embedding of plugin is no list\");\r\n \r\n      // Embed all embeddings of the plugin\r\n      var that = this;\r\n      obj[\"embed\"].forEach(function(embed) {\r\n\r\n        if (typeof embed !== 'object')\r\n          throw new Error(\"Embedding of plugin is no object\");\r\n\r\n        // Needs to be localized as well\r\n        let title = embed[\"title\"];        \r\n        let panel = embed[\"panel\"];\r\n        let onClick = embed[\"onClick\"];\r\n        let icon = embed[\"icon\"];\r\n        \r\n        if (!panel || !(buttons[panel] || buttonsSingle[panel]))\r\n          throw new Error(\"Panel for plugin is invalid\"); \r\n\r\n        // The embedding will open a widget\r\n        if (!onClick[\"action\"] ||\r\n            onClick[\"action\"] == \"addWidget\" ||\r\n            onClick[\"action\"] == \"setWidget\") {\r\n          \r\n          let cb = function (e) {\r\n\r\n            // \"this\" is bind to the panel\r\n            // \"this\".button is the button\r\n            // \"that\" is the server object\r\n\r\n            // The button has a state and the state is associated to the\r\n            // a intermediate object to toggle the view\r\n            if ('state' in this.button && this.button.state.associates() > 0) {\r\n\r\n              let s = this.button.state;\r\n\r\n              // The associated service is existent\r\n              if (services[this.button['widgetID']]) {\r\n                s.roll();\r\n                return;\r\n              }\r\n\r\n              // The service is not existent\r\n              else {\r\n\r\n                // Remove broken state associations\r\n                s.clear();\r\n                s.set(true);\r\n              }\r\n            };\r\n\r\n            // Add the widget to the panel\r\n            let id = that.addWidget(this, {\r\n              \"name\": name,\r\n              \"src\": onClick[\"template\"], // that._interpolateURI(onClick[\"template\"], this.match);\r\n              \"permissions\": onClick[\"permissions\"],\r\n              \"desc\":desc\r\n            });\r\n            plugin[\"widgets\"].push(id);\r\n            \r\n            // If a state exists, associate with a mediator object\r\n            if ('state' in this.button) {\r\n              this.button['widgetID'] = id;\r\n              this.button.state.associate({\r\n                setState : function (value) {\r\n                  // Minimize the widget\r\n                  if (value == false) {\r\n                    services[id].minimize();\r\n                  }\r\n                  else {\r\n                    services[id].show();                    \r\n                  };\r\n                }\r\n              });\r\n            }\r\n          };\r\n\r\n\r\n          // Button object\r\n          let obj = {'cls':embed[\"classes\"], 'icon': icon }\r\n\r\n          if (onClick[\"action\"] && onClick[\"action\"] == \"setWidget\") {\r\n\r\n            // Create a boolean state value, that initializes to true == opened\r\n            obj['state'] = stateClass.create([true, false]);\r\n          };\r\n          \r\n          // Add to dynamic button list (e.g. for matches)\r\n          if (buttons[panel]) {\r\n            buttons[panel].push([title, obj, cb]);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) already loaded\r\n          else if (KorAP.Panel[panel]) {\r\n            KorAP.Panel[panel].actions.add(title, obj, cb);\r\n          }\r\n\r\n          // Add to static button list (e.g. for query) not yet loaded\r\n          else {\r\n            buttonsSingle[panel].push([title, obj, cb]);\r\n          }\r\n        }\r\n\r\n        // TODO There is no possibility to add icons to an plugin toggle button right now. \r\n        else if (onClick[\"action\"] == \"toggle\") {\r\n\r\n          // TODO:\r\n          //   Accept a \"value\" list here for toggling, which should\r\n          //   also allow for \"rolling\" through states via CSS classes\r\n          //   as 'toggle-true', 'toggle-false' etc.\r\n\r\n          let state = stateClass.create([true, false]);\r\n\r\n          // TODO:\r\n          //   Lazy registration (see above!)\r\n          KorAP.Panel[panel].actions.addToggle(title, {'cls':[\"title\"]}, state);\r\n\r\n          // Add the service\r\n          let id = this.addService({\r\n            \"name\" : name,\r\n            // TODO:\r\n            //   Use the \"service\" keyword\r\n            \"src\" : onClick[\"template\"],\r\n            \"permissions\" : onClick[\"permissions\"]\r\n          });\r\n\r\n          // TODO:\r\n          //   This is a bit stupid to get the service window\r\n          let service = services[id];\r\n          let iframe = service.load();\r\n\r\n          // Create object to communicate the toggle state\r\n          // once the iframe is loaded.\r\n          iframe.onload = function () {\r\n            let sendToggle = {\r\n              setState : function (val) {\r\n                service.sendMsg({\r\n                  action: 'state',\r\n                  key : onClick['state'],\r\n                  value : val\r\n                });\r\n              }\r\n            };\r\n\r\n            // Associate object with the state\r\n            state.associate(sendToggle);          \r\n          };\r\n\r\n          plugin[\"services\"].push(id);\r\n        };\r\n      }, this);\r\n    },\r\n\r\n    // TODO:\r\n    //   Interpolate URIs similar to https://tools.ietf.org/html/rfc6570\r\n    //   but as simple as possible\r\n    _interpolateURI : function (uri, obj) {\r\n      // ...\r\n    },\r\n\r\n\r\n    /**\r\n     * Get named button group - better rename to \"action\"\r\n     */\r\n    buttonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        return buttons[name];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        return buttonsSingle[name];\r\n      };\r\n      return [];\r\n    },\r\n\r\n    /**\r\n     * Clear named button group - better rename to \"action\"\r\n     */\r\n    clearButtonGroup : function (name) {\r\n      if (buttons[name] != undefined) {\r\n        buttons[name] = [];\r\n      } else if (buttonsSingle[name] != undefined) {\r\n        buttonsSingle[name] = [];\r\n      }\r\n    },\r\n\r\n    // Optionally initialize the service mechanism and get an ID\r\n    _getServiceID : function () {\r\n\r\n      // Is it the first service?\r\n      if (!this._listener) {\r\n\r\n        /*\r\n         * Establish the global 'message' hook.\r\n         */\r\n        this._listener = this._receiveMsg.bind(this);\r\n        window.addEventListener(\"message\", this._listener);\r\n        \r\n        // Every second increase the limits of all registered services\r\n        this._timer = window.setInterval(function () {\r\n          for (let i = 0; i < limits.length; i++) {\r\n            if (limits[i]++ >= maxMessages) {\r\n              limits[i] = maxMessages;\r\n            }\r\n          }\r\n        }, 1000);\r\n      };\r\n\r\n      // Create a unique random ID per service\r\n      return 'id-' + this._randomID();\r\n    },\r\n    \r\n    /**\r\n     * Add a service in a certain panel and return the id.\r\n     */\r\n    addService : function (data) {\r\n      if (!data[\"src\"])\r\n        return;\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n\r\n      // Create a new service\r\n      let service = serviceClass.create(data);\r\n      \r\n      services[id] = service;\r\n      limits[id] = maxMessages;\r\n\r\n      // Add service to panel\r\n      this.element().appendChild(\r\n        service.load()\r\n      );\r\n      \r\n      return id;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Open a new widget view in a certain panel and return\r\n     * the id.\r\n     */\r\n    addWidget : function (panel, data) {\r\n      // panel, name, src, permissions\r\n\r\n      let id = this._getServiceID();\r\n\r\n      data[\"id\"] = id;\r\n      \r\n      // Create a new widget\r\n      var widget = widgetClass.create(data);\r\n\r\n      // Store the widget based on the identifier\r\n      services[id] = widget;\r\n      limits[id] = maxMessages;\r\n\r\n      widget._mgr = this;\r\n\r\n      // Add widget to panel\r\n      panel.add(widget);\r\n\r\n      return id;\r\n    },\r\n\r\n\r\n    /**\r\n     * Get service by identifier\r\n     */\r\n    service : function (id) {\r\n      return services[id];\r\n    },\r\n\r\n    \r\n    // Receive a call from an embedded service.\r\n    // The handling needs to be very careful,\r\n    // as this can easily become a security nightmare.\r\n    _receiveMsg : function (e) {\r\n      // Get event data\r\n      var d = e.data;\r\n\r\n      // If no data given - fail\r\n      // (probably check that it's an assoc array)\r\n      if (!d)\r\n        return;\r\n\r\n      // e.origin is probably set and okay - CHECK!\r\n\r\n      // Get origin ID\r\n      var id = d[\"originID\"];\r\n\r\n      // If no origin ID given - fail\r\n      if (!id)\r\n        return;\r\n\r\n      // Get the service\r\n      let service = services[id];\r\n\r\n      // If the addressed service does not exist - fail\r\n      if (!service)\r\n        return;\r\n\r\n      // Check for message limits\r\n      if (limits[id]-- < 0) {\r\n\r\n        // Kill service\r\n        KorAP.log(0, 'Suspicious action by service', service.src);\r\n\r\n        // TODO:\r\n        //   Potentially kill the whole plugin!\r\n\r\n        // This removes all connections before closing the service \r\n        this._closeService(service.id);\r\n\r\n        // if (service.isWidget)\r\n        service.close();\r\n     \r\n        return;\r\n      };\r\n\r\n      // Resize the iframe\r\n      switch (d.action) {\r\n      case 'resize':\r\n        if (service.isWidget)\r\n          service.resize(d);\r\n        break;\r\n\r\n      // Log message from iframe\r\n      case 'log':\r\n        KorAP.log(d.code, d.msg,  service.src);\r\n        break;\r\n\r\n      // Modify pipes\r\n      case 'pipe':\r\n        if (KorAP.Pipe != undefined) {\r\n          if (d.job == 'del') {\r\n            KorAP.Pipe.remove(d.service);\r\n          } else {\r\n            KorAP.Pipe.append(d.service);\r\n          };\r\n        };\r\n        break;\r\n\r\n      // Get information from the embedding platform\r\n      case 'get':\r\n\r\n        // Get KoralQuery\r\n        if (d.key == 'KQ') {\r\n          if (KorAP.koralQuery !== undefined) {    \r\n            d[\"value\"] = KorAP.koralQuery;\r\n          };\r\n        }\r\n\r\n        // Get Query information from from\r\n        else if (d.key == 'QueryForm') {\r\n          let doc = document;\r\n          let v = d[\"value\"] = {};\r\n\r\n          var el;\r\n          if (el = doc.getElementById('q-field')) {\r\n            v[\"q\"] = el.value;\r\n          };\r\n          if (el = doc.getElementById('ql-field')) {\r\n            v[\"ql\"] = el.value;\r\n          };\r\n          if (el = KorAP.vc) {\r\n            v[\"cq\"] = el.toQuery();\r\n          };\r\n        }\r\n\r\n        // Get Query information from parameters\r\n        else if (d.key == 'QueryParam') {\r\n\r\n          // Supported in all modern browsers\r\n          var p = new URLSearchParams(window.location.search);\r\n          let v = d[\"value\"] = {};\r\n          v[\"q\"] = p.get('q');\r\n          v[\"ql\"] = p.get('ql');\r\n          v[\"cq\"] = p.get('cq');\r\n        };\r\n      };\r\n\r\n      // data needs to be mirrored\r\n      if (d._id) {\r\n        service.sendMsg(d);\r\n      };\r\n\r\n      // TODO:\r\n      //   Close\r\n    },\r\n\r\n    // Close the service\r\n    _closeService : function (id) {\r\n      delete limits[id];\r\n      \r\n      // Close the iframe\r\n      if (services[id] && services[id]._closeIframe) {\r\n        services[id]._closeIframe();\r\n\r\n        // Remove from list\r\n        delete services[id];\r\n      };\r\n\r\n\r\n      // Remove listeners in case no widget\r\n      // is available any longer\r\n      if (Object.keys(limits).length == 0)\r\n        this._removeListener();\r\n    },\r\n\r\n    // Get a random identifier\r\n    _randomID : function () {\r\n      return randomID(20);\r\n    },\r\n\r\n    // Remove the listener\r\n    _removeListener : function () {\r\n      window.clearInterval(this._timer);\r\n      this._timer = undefined;\r\n      window.removeEventListener(\"message\", this._listener);\r\n      this._listener = undefined;\r\n    },\r\n\r\n    /**\r\n     * Return the service element.\r\n     */\r\n    element : function () {\r\n      if (!this._el) {\r\n        this._el = document.createElement('div');\r\n        this._el.setAttribute(\"id\", \"services\");\r\n      }\r\n      return this._el;\r\n    },\r\n    \r\n    // Destructor, just for testing scenarios\r\n    destroy : function () {\r\n      limits = {};\r\n      Object.keys(services).forEach(\r\n        s => services[s].close()\r\n      );\r\n      services = {};\r\n      Object.keys(buttons).forEach(\r\n        b => buttons[b] = []\r\n      );\r\n      Object.keys(buttonsSingle).forEach(\r\n        b => buttonsSingle[b] = []\r\n      );\r\n\r\n      if (this._el) {\r\n        let e = this._el;\r\n        if (e.parentNode) {\r\n          e.parentNode.removeChild(e);\r\n        };\r\n        this._el = null;\r\n      };\r\n      \r\n      this._removeListener();\r\n    }\r\n  };\r\n});\r\n\n/**\r\n * Create a pipe object, that holds a list of services\r\n * meant to transform the KQ passed before it's finally\r\n * passed to the search engine.\r\n *\r\n * @author Nils Diewald\r\n */\r\n\r\ndefine('pipe',[],function () {\r\n  const notNullRe = new RegExp(\"[a-zA-Z0-9]\");\r\n\r\n  // Trim and check\r\n  function _notNull (service) {\r\n    service = service.trim();\r\n    if (service.match(notNullRe)) {\r\n      return service;\r\n    };\r\n    return null;\r\n  };\r\n  \r\n  return {\r\n\r\n    /**\r\n     * Constructor\r\n     */\r\n    create : function () {\r\n      const obj = Object.create(this);\r\n      obj._pipe = [];\r\n      return obj;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Append service to pipe.\r\n     */\r\n    append : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.push(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n    \r\n    /**\r\n     * Prepend service to pipe.\r\n     */\r\n    prepend : function (service) {\r\n      service = _notNull(service);\r\n      if (service) {\r\n        this._pipe.unshift(service);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * Remove service from the pipe.\r\n     */\r\n    remove : function (service) {\r\n      const i = this._pipe.indexOf(service);\r\n      if (i != -1) {\r\n        this._pipe.splice(i, 1);\r\n        this._update();\r\n      };\r\n    },\r\n\r\n\r\n    /**\r\n     * The number of services in the pipe.\r\n     */\r\n    size : function () {\r\n      return this._pipe.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Return the pipe as a string.\r\n     */\r\n    toString : function () {\r\n      return this._pipe.join(',');\r\n    },\r\n\r\n\r\n    /**\r\n     * Update the pipe value.\r\n     */\r\n    _update : function () {\r\n      if (this.e != null) {\r\n        this.e.setAttribute(\"value\", this.toString());\r\n      };\r\n    },\r\n    \r\n\r\n    /**\r\n     * Return the pipe element.\r\n     */\r\n    element : function () {\r\n      let e = this.e;\r\n      if (e == null) {\r\n        e = this.e = document.createElement('input');\r\n        e.setAttribute(\"type\",\"text\");\r\n        e.setAttribute(\"name\",\"pipe\");\r\n        e.classList.add(\"pipe\");\r\n      };\r\n      return e;\r\n    }\r\n  };\r\n});\r\n\n\r\n\r\ndefine('api',['util'], function () {\r\n\r\n  // TODO:\r\n  // - https://github.com/honza/140medley/blob/master/140medley.js\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\r\n  // - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\r\n  // - r.addEventListener(\"progress\", updateProgress, false);\r\n  // - http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml\r\n  // - http://stackoverflow.com/questions/6112744/load-javascript-on-demand\r\n\r\n  // See https://flaviocopes.com/http-request-headers/ for a list of headers\r\n\r\n  KorAP.URL = KorAP.URL !== undefined ? KorAP.URL : '';\r\n  KorAP.API = KorAP.API || {};\r\n\r\n  const legacySigle = new RegExp('^([^_]+)_([^\\\\.]+)\\\\.(.+?)$');\r\n\r\n  /**\r\n   * Retrieve information about a match\r\n   */\r\n  KorAP.API.getMatchInfo = function (match, param, cb) {\r\n\r\n    // match is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus';\r\n    /*\r\n      url += '/' + match.corpusID;\r\n      url += '/' + match.docID;\r\n      url += '/' + match.textID;\r\n    */\r\n\r\n    // This is for legacy support\r\n    const legacy = legacySigle.exec(match.textSigle);\r\n    let docFragment = \"\";\r\n    if (legacy !== null && legacy[0]) {\r\n      docFragment = legacy[1] + '/' + legacy[2] + '/' + legacy[3];\r\n    }\r\n    else {\r\n      docFragment = match.textSigle;\r\n    }\r\n\r\n    docFragment += '/' + match.matchID;\r\n    url += '/' + docFragment;\r\n\r\n    // { spans: true, layer:x, foundry : y}\r\n    if (param['spans'] == true) {\r\n      url += '?spans=true';\r\n      docFragment += ' +spans ';\r\n      if (param['foundry'] !== undefined) {\r\n\t      url += '&foundry=' + param['foundry'];\r\n        docFragment += param['foundry'];\r\n      };\r\n      if (param['layer'] !== undefined) {\r\n\t      url += '&layer=' + param['layer'];\r\n        docFragment += '/'+param['layer'];\r\n      }\r\n    }\r\n    \r\n    // { spans : false, layer: [Array of KorAP.InfoLayer] }\r\n    else {\r\n      // TODO\r\n      docFragment += ' -spans';\r\n      url += '?spans=false';\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"MatchInfo: \" + docFragment);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about a document.\r\n   */\r\n  KorAP.API.getTextInfo = function (doc, param, cb) {\r\n\r\n    // doc is a KorAP.Match object\r\n    let url = KorAP.URL + '/corpus' + '/' + doc.textSigle;\r\n\r\n    if (param['fields'] !== undefined) {\r\n      url += '?fields='; // TODO!\r\n    }\r\n    else {\r\n      url += '?fields=@all'; // TODO: Maybe '*'?\r\n    }\r\n\r\n    KorAP.API.getJSON(url, cb, \"TextInfo: \" + doc.textSigle);\r\n  };\r\n\r\n\r\n  /**\r\n   * Retrieve information about virtual corpora\r\n   */\r\n  KorAP.API.getCollections = function (cb) {\r\n    KorAP.API.getJSON(KorAP.URL + '/collection', cb, \"CorpusInfo\");\r\n  };\r\n\r\n  \r\n  /**\r\n   * Retrieve information about corpus statistic\r\n   * \r\n   * Example URL:  /corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   * \r\n   * @param cq corpus query (formerly collectionQuery)\r\n   * \r\n   * Adress the MOJO-Endpoint for example with\r\n   * http://localhost:3000/corpus?cq=availability+%3D+%2FCC-BY.*%2F+%26+textClass+%3D+%22kultur%22\r\n   */\r\n  KorAP.API.getCorpStat = function (cq, cb){\r\n  \tlet url  =  KorAP.URL + \"/corpus?cq=\" + encodeURIComponent(cq);\r\n  \tKorAP.API.getJSON(url, cb, \"CorpusInfo: \" + cq);\r\n  };\r\n  \r\n\r\n  /**\r\n   * General method to retrieve JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File is located\r\n   * @param {function} onload The callback function that recieves the retrieved JSON as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   */ \r\n  KorAP.API.getJSON = function (url, onload, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"GET\", url, true);\r\n\r\n    // Dispatch global \"window\" event\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        let json;\r\n        try {\r\n          json = JSON.parse(this.responseText);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0, e);\r\n          console.log(e);\r\n          onload(undefined);\r\n          return;\r\n        };\r\n\r\n\t      if (json !== undefined && json[\"errors\"] !== undefined) {\r\n\t        json[\"errors\"].forEach(\r\n            e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n\t        );\r\n\t      }\r\n\r\n        else if (this.status !== 200) {\r\n        \tKorAP.log(this.status, this.statusText);\r\n        };\r\n\r\n\t      if (this.status === 200) {\r\n\t        onload(json);\r\n\t      }\r\n\r\n\t      else {\r\n          onload(undefined);\r\n        };\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  };\r\n\r\n\r\n  /**\r\n   * General method to put JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSON} json The JSON that is getting transfered. Be sure to have this be a JSON (stringify)\r\n   * @param {String} title How to store this request in the logs\r\n   */ \r\n  KorAP.API.putJSON = function (url, json, title) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"PUT\", url, true); //D PUT is not cacheable, but I hope that doesn't matter: https://developer.mozilla.org/en-US/docs/Glossary/Cacheable\r\n                                // There is also POST, I couldn't decide why not to use PUT, though POST may be safer to use\r\n\r\n    // Dispatch global \"window\" event. //D I don't know what this does.\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\"); //Do I need this?\r\n    req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        //There is no return value, so we do not need to create a JSON.\r\n\t      \r\n        if (this.status === 200) {\r\n          KorAP.log(this.status, \"api.js says: A HTTP PUT Method was invoked such that error status 200 was recieved.\\\r\n          This should not be possible, 201 should be returned.\\n\" + this.statusText)\r\n        }\r\n        else if (this.status !== 201) {\r\n          KorAP.log(this.status, this.statusText);\r\n          //TODO Show the user his request failed!\r\n        };\r\n\r\n\t      //D I believe no further actions are necessary\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send(json);\r\n  };\r\n\r\n\r\n  /**\r\n   * General method to delete a file at a specific URL\r\n   * \r\n   * @param {String} url The url at which the to be deleted file is located\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} cb Optional. Callback function for error handling, recieves JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteAtURL = function (url, title, cb) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(\"DELETE\", url, true);\r\n\r\n    // Dispatch global \"window\" event. //D I don't know what this does.\r\n    const reqE = new CustomEvent('korapRequest', {\r\n      bubbles : false,\r\n      detail: {\r\n        \"url\" : url,\r\n        \"title\" : title\r\n      }\r\n    });\r\n    window.dispatchEvent(reqE);\r\n    \r\n    req.setRequestHeader(\"Accept\", \"application/json\"); //Could this be bad? Maybe we want to delete non JSON files later.\r\n    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); \r\n    req.onreadystatechange = function () {\r\n      /*\r\n\t      States:\r\n\t      0 - unsent (prior to open)\r\n\t      1 - opened (prior to send)\r\n\t      2 - headers received\r\n\t      3 - loading (responseText has partial data)\r\n\t      4 - done\r\n      */\r\n      if (this.readyState == 4) {\r\n\r\n        //There is no return value, so we do not need to create a JSON.\r\n        \r\n        //If we add a callback function for error handling to put and get, I would do it exactly like this.\r\n        //It being the last parameter means calls of getJSON don't need to be changed.\r\n\r\n        if (this.status !== 200) {\r\n          KorAP.log(this.status, this.statusText)\r\n          if (typeof(cb) === \"function\"){\r\n            cb({\r\n              \"status\" : this.status,\r\n              \"statusText\" : this.statusText\r\n            });\r\n          };\r\n        }\r\n        else if (this.status === 200) { //D Does this achieve anything?\r\n          if (typeof(cb) === \"function\"){\r\n            cb({\r\n              \"status\" : this.status,\r\n              \"statusText\" : this.statusText\r\n            });\r\n          };\r\n        };\r\n        //TODO show the user his request failed.\r\n\r\n\t      //D I believe no further actions are necessary\r\n      }\r\n    };\r\n\r\n    /*D As the default value for .timeout is 0, \r\n    which means unlimited/there is no timeout, this does not have an effect */\r\n    req.ontimeout = function () {\r\n      KorAP.log(0, 'Request Timeout');\r\n    };\r\n    req.send();\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} cb The callback function that recieves the JSON Listof queries\r\n   */\r\n  KorAP.API.getQueryList = function (cb){\r\n    KorAP.getJSON(KorAP.URL + \"/query/\", cb, \"getSavedQueryList\");\r\n  };\r\n\r\n  /**\r\n   * Retrieve specific saved query by query name\r\n   * \r\n   * @param {String} qn The name of the query to be retrieved. Must be a string\r\n   * @param {function} cb The callback function that recieves the query JSON Object\r\n   */\r\n  KorAP.API.getQuery = function (qn, cb){\r\n    KorAP.getJSON(KorAP.URL + \"/query/\" + qn, cb, \"getSavedQuery of name \"+ qn);\r\n  };\r\n\r\n  /**\r\n   * Put new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {function} json The query. Be sure to have this be a JSON (stringify)\r\n   */\r\n  KorAP.API.putQuery = function (qn, json){\r\n    KorAP.putJSON(KorAP.URL + \"/query/\" + qn, json, \"putQuery of name \"+ qn);\r\n  };\r\n\r\n  /**\r\n   * delete query by query name\r\n   * \r\n   * @param {String} qn The name of the to be deleted query\r\n   * @param {function} cb Optional. Callback function for error handling, recieves JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, cb){\r\n    KorAP.deleteAtURL(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, cb);\r\n  };\r\n});\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\nwindow.PArok = function (b,n){if(n){b=document.createElement('a');b.href=n}var d=b.search,q=RegExp,p=String.fromCharCode,r='il',c=[],t,f=Math.pow;k=b.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);a=function(x){var e=0,g,o='',l;while(e<x.length){l=x.charAt(e++);if(l.match(/[A-Za-z]/)){o+=p((l<='Z'?90:122)>=(l=l.charCodeAt(0)+13)?l:l-26)}else if(l=='-'){g='';l=x.charAt(e++);while(l.match(/\\d/)){g+=l;l=x.charAt(e++)}e--;o+=p(parseInt(g))}else return}s=o.length;u=Math.abs(673%s-s);o=o.substr(u)+o.substr(0,u);t='';for(i=0;i<s;i++){t+=p(o.charCodeAt(i)^k[1].charCodeAt(k[1].length%(i+1)))}return t};while(d){d=d.replace(/^[\\?\\&]([^\\&]+)/,'');t=q.$1;if(t.match(/^(sid|b?cc|to)=(.+)$/)){if(q.$1=='sid')c.push('to='+a(q.$2)+'@'+a(k[2]));else c.push(q.$1+'='+a(q.$2));}else c.push(t.replace(/\\+/g,' '))}location.href='ma'+r+'to:?'+c.join('&');return false}\r\n});\r\n\n/*\r\n * Initialize The JS frontend part and decorate\r\n * the static HTML data.\r\n *\r\n * @author Nils Diewald\r\n *\r\n * TODO: Create lazy loading of objects including\r\n * - obj.hint()\r\n * - obj.alertify()\r\n * - obj.session()\r\n * - obj.tutorial()\r\n * - obj.vc() // toggle\r\n * - obj.matchCreate() (using webpack)\r\n * - obj.koral() (show result, parse for errors ...)\r\n * - obj.alignment() // toggle\r\n */\r\n\r\n\r\ndefine('init',[\r\n  'match',\r\n  'hint',\r\n  'vc',\r\n  'tutorial',\r\n  'lib/domReady',\r\n  'vc/array',\r\n  'lib/alertify',\r\n  'session',\r\n  'selectMenu',\r\n  'panel/result',\r\n  'panel/query',\r\n  'tour/tours',\r\n  'plugin/server',\r\n  'pipe',\r\n  'api',\r\n  'mailToChiffre',\r\n  'util',\r\n  'state'\r\n], function (matchClass,\r\n             hintClass,\r\n             vcClass,\r\n             tutClass,\r\n             domReady,\r\n             vcArray,\r\n             alertifyClass,\r\n             sessionClass,\r\n             selectMenuClass,\r\n             resultPanelClass,\r\n             queryPanelClass,\r\n             tourClass,\r\n             pluginClass,\r\n             pipeClass) {\r\n\r\n  const d = document;\r\n\r\n  // Remove the no-js class from the body\r\n  d.body.classList.remove('no-js');\r\n\r\n  // Set base URL\r\n  KorAP.URL = d.body.getAttribute('data-korap-url') || \"\";\r\n\r\n  // Get koralQuery response\r\n  const kqe = d.getElementById('koralQuery');\r\n  if (kqe !== null) {\r\n    KorAP.koralQuery = JSON.parse(kqe.getAttribute('data-koralquery') || \"\");\r\n  };\r\n  \r\n  // Create suffix if KorAP is run in a subfolder\r\n  KorAP.session = sessionClass.create(\r\n    KorAP.URL.length > 0 ? 'kalamarJS-' + KorAP.URL.slugify() : 'kalamarJS'\r\n  );\r\n\r\n  // Override KorAP.log\r\n  window.alertify = alertifyClass;\r\n  KorAP.log = function (code, msg, src) {\r\n\r\n    if (src) {\r\n      msg += '<code class=\"src\">'+src+'</code>';\r\n    };\r\n\r\n    // Use alertify to log errors\r\n    alertifyClass.log(\r\n      (code === 0 ? '' : code + ': ') +\r\n        msg,\r\n      'error',\r\n      10000\r\n    );\r\n  };\r\n\r\n  KorAP.vc = vcClass.create(vcArray); \r\n  \r\n  KorAP.tourshow =  function(){\r\n    tourClass.gTstartSearch().start();\r\n  };\r\n \r\n  KorAP.tourshowR = function(){\r\n    tourClass.gTshowResults().start();\r\n  };\r\n    \r\n  domReady(function (event) {\r\n      \r\n    var obj = {};\r\n\r\n    // What should be visible in the beginning?\r\n    var show = KorAP.session.get('show') || {};\r\n    \r\n    KorAP.Panel = KorAP.Panel || {}\r\n\r\n    /**\r\n     * Release notifications\r\n     */\r\n    if (KorAP.Notifications !== undefined) {\r\n      KorAP.Notifications.forEach(function(n) {\r\n        var msg = n[1];\r\n        if (n[2]) {\r\n          msg += '<code class=\"src\">'+n[2]+'</code>';\r\n        };\r\n        alertifyClass.log(msg, n[0], 10000);\r\n      });\r\n    };\r\n\r\n    /**\r\n     * Replace Virtual Corpus field\r\n     */\r\n    var vcname, vcchoose;\r\n    var input = d.getElementById('cq');\r\n\r\n    var vc = KorAP.vc;\r\n    \r\n    // Add vc name object\r\n    if (input) {\r\n      input.style.display = 'none';\r\n      vcname = d.createElement('span');\r\n      vcname.setAttribute('id', 'vc-choose');\r\n      vcname.classList.add('select');\r\n\r\n      // Load virtual corpus object\r\n      // Supports \"collection\" for legacy reasons\r\n      if (KorAP.koralQuery !== undefined && (KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"])) {\r\n        try {\r\n          vc.fromJson(KorAP.koralQuery[\"collection\"] || KorAP.koralQuery[\"corpus\"]);\r\n        }\r\n        catch (e) {\r\n          KorAP.log(0,e);\r\n        }\r\n      };\r\n\r\n      vcchoose = vcname.addE('span');\r\n      vcchoose.addT(vc.getName());\r\n\r\n      if (vc.wasRewritten()) {\r\n        vcchoose.classList.add('rewritten');\r\n      };\r\n\r\n      input.parentNode.insertBefore(vcname, input);\r\n    };\r\n\r\n    /**\r\n     * Add actions to match entries\r\n     */\r\n    var matchElements = d.querySelectorAll(\r\n      '#search > ol > li'\r\n    );\r\n\r\n    matchElements.forEach(function(e) {\r\n\r\n      // Define class for active elements\r\n      if (e.classList.contains('active')) {\r\n        if (this._match === undefined) {\r\n          // lazyLoad\r\n          matchClass.create(e).init();\r\n        };\r\n      }\r\n\r\n      // Define class for inactive elements\r\n      else {\r\n        e.addEventListener('click', function (e) {\r\n          if (this._match !== undefined)\r\n            this._match.open();\r\n          else {\r\n            // lazyLoad\r\n            matchClass.create(this).open();\r\n          };\r\n          // This would prevent the sidebar to go back\r\n          // e.halt();\r\n        });\r\n        e.addEventListener('keydown', function (e) {\r\n          var code = _codeFromEvent(e);\r\n          \r\n          switch (code) {\r\n          case 32:\r\n            if (this._match !== undefined)\r\n              this._match.toggle();\r\n            else {\r\n              // lazyLoad\r\n              matchClass.create(this).open();\r\n            };\r\n            e.halt();\r\n            break;\r\n          };\r\n        });\r\n      };\r\n    }, this);\r\n    \r\n    // Add focus listener to aside\r\n    var aside = d.getElementsByTagName('aside')[0];\r\n\r\n    if (aside && aside.classList.contains('active') == false) {\r\n\r\n      // Horrible lock to deal with sidebar clicks\r\n      var asideClicked = false;\r\n      \r\n      // Make aside active on focus\r\n      aside.addEventListener('focus', function(e) {\r\n        this.classList.add('active');\r\n      });\r\n\r\n      // Deactivate focus when clicking anywhere else\r\n      var body = d.getElementsByTagName('body')[0];\r\n      if (body !== null) {\r\n        body.addEventListener('click', function() {\r\n          if (!asideClicked) {\r\n            aside.classList.remove('active');\r\n          }\r\n          else {\r\n            asideClicked = false;\r\n          };\r\n        });\r\n      };\r\n\r\n      /* Stop click event on aside\r\n       * (to not trickle down to body)\r\n       */\r\n      aside.addEventListener('click', function(e) {\r\n        asideClicked = true;\r\n      });\r\n    };\r\n\r\n      \r\n    // Replace QL select menus with KorAP menus\r\n    var qlField = d.getElementById('ql-field');\r\n    if (qlField !== null) {\r\n      KorAP.QLmenu = selectMenuClass.create(\r\n        d.getElementById('ql-field').parentNode\r\n      ).limit(5);\r\n    };\r\n\r\n    var resultInfo = d.getElementById('resultinfo');\r\n\r\n    /**\r\n     * Add result panel\r\n     */\r\n    var resultPanel = resultPanelClass.create(show);\r\n\r\n    if (resultInfo != null) {\r\n\r\n      // Move buttons to resultinfo\r\n      resultInfo.appendChild(resultPanel.actions.element());\r\n\r\n      // The views are at the top of the search results\r\n      var sb = d.getElementById('search');\r\n      sb.insertBefore(resultPanel.element(), sb.firstChild);\r\n    };\r\n\r\n    \r\n    // There is a koralQuery\r\n    if (KorAP.koralQuery !== undefined) {    \r\n\r\n      // Add KoralQuery view to result panel\r\n      if (resultInfo !== null) {\r\n        resultPanel.addKqAction()\r\n      };\r\n\r\n      if (KorAP.koralQuery[\"errors\"]) {\r\n        KorAP.koralQuery[\"errors\"].forEach(function(e) {\r\n\r\n          // Malformed query\r\n          if (e[0] === 302 && e[2] !== undefined) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(e[2], e[1]);\r\n          }\r\n\r\n          // no query\r\n          else if (e[0] === 301) {\r\n            obj.hint = hintClass.create();\r\n            obj.hint.alert(0, e[1]);      \r\n          }\r\n        });\r\n      };\r\n    };\r\n\r\n    \r\n    /*\r\n     * There is more than 0 matches, so allow for\r\n     * alignment toggling (left <=> right)\r\n     */\r\n    if (matchElements.length > 0)\r\n      resultPanel.addAlignAction();\r\n\r\n    KorAP.Panel['result'] = resultPanel;\r\n    /*\r\n     * Toggle the Virtual Corpus builder\r\n     */\r\n    if (vcname) {\r\n      vc.onMinimize = function () {\r\n        vcname.classList.remove('active');\r\n        delete show['vc'];\r\n      };\r\n\r\n      vc.onOpen = function () {\r\n        vcname.classList.add('active');\r\n\r\n        var view = d.getElementById('vc-view');\r\n        if (!view.firstChild)\r\n          view.appendChild(this.element());\r\n        \r\n        show['vc'] = true;\r\n      };\r\n      \r\n      var vcclick = function () {\r\n        if (vc.isOpen()) {\r\n          vc.minimize()\r\n        }\r\n        else {\r\n          vc.open();\r\n        };\r\n      };\r\n\r\n      vcname.onclick = vcclick;\r\n\r\n      // Click, if the VC should be shown\r\n      if (show['vc']) {\r\n        vcclick.apply();\r\n      };\r\n    };\r\n\r\n    \r\n    /**\r\n     * Init Tutorial view\r\n     */\r\n    if (d.getElementById('view-tutorial')) {\r\n      window.tutorial = tutClass.create(\r\n        d.getElementById('view-tutorial'),\r\n        KorAP.session\r\n      );\r\n      obj.tutorial = window.tutorial;\r\n    }\r\n\r\n    // Tutorial is in parent\r\n    else if (window.parent) {\r\n      obj.tutorial = window.parent.tutorial;\r\n    };\r\n\r\n    // Initialize queries for d\r\n    if (obj.tutorial) {\r\n      obj.tutorial.initQueries(d);\r\n\r\n      // Initialize documentation links\r\n      obj.tutorial.initDocLinks(d);\r\n    };\r\n\r\n\r\n    /**\r\n     * Add VC creation on submission.\r\n     */\r\n    var form = d.getElementById('searchform');\r\n    if (form !== null) {\r\n      form.addEventListener('submit', function (e) {\r\n        var qf = d.getElementById('q-field');\r\n        \r\n        // No query was defined\r\n        if (qf.value === undefined || qf.value === '') {\r\n          qf.focus();\r\n          e.halt();\r\n          KorAP.log(700, \"No query given\");\r\n          return;\r\n        };\r\n        \r\n        // Store session information\r\n        KorAP.session.set(\"show\", show);\r\n\r\n        if (vc !== undefined) {\r\n          input.value = vc.toQuery();\r\n          if (input.value == '')\r\n            input.removeAttribute('name');\r\n        }\r\n        else {\r\n          input.removeAttribute('value');\r\n          input.removeAttribute('name');\r\n        };\r\n\r\n        // This would preferably set the query to be \"disabled\",\r\n        // but in that case the query wouldn't be submitted\r\n        // at all.\r\n        // Setting the cursor to \"progress\" fails in current versions\r\n        // of webkit.\r\n        qf.classList.add(\"loading\");\r\n        d.getElementById('qsubmit').classList.add(\"loading\");\r\n      });\r\n    };\r\n \r\n    \r\n    //Starts the guided tour at the next page\r\n    if(KorAP.session.get(\"tour\")){\r\n      tourClass.gTshowResults().start();\r\n    }\r\n    \r\n    /**\r\n     * Init hint helper\r\n     * has to be final because of\r\n     * reposition\r\n     */\r\n    // Todo: Pass an element, so this works with\r\n    // tutorial pages as well!\r\n    if (obj.hint === undefined)\r\n      obj.hint = hintClass.create();\r\n\r\n    // Add the hinthelper to the KorAP object to make it manipulatable globally\r\n    KorAP.Hint = obj.hint;\r\n\r\n\r\n    /**\r\n     * Add query panel\r\n     */\r\n    var queryPanel = queryPanelClass.create();\r\n\r\n    // Get input field\r\n    var sform = d.getElementById(\"searchform\");\r\n    var vcView = d.getElementById('vc-view')\r\n    if (sform && vcView) {\r\n      // The views are below the query bar\r\n      sform.insertBefore(queryPanel.element(), vcView);\r\n      KorAP.Panel['query'] = queryPanel;\r\n    }\r\n\r\n    /**\r\n     * Initialize Plugin registry.\r\n     */\r\n    let p = KorAP.Plugins;\r\n    if (p && p.length > 0) {\r\n      // Load Plugin Server first\r\n      KorAP.Plugin = pluginClass.create();\r\n\r\n      // Add services container to head\r\n      d.head.appendChild(KorAP.Plugin.element());\r\n\r\n      // Add pipe form\r\n      KorAP.Pipe = pipeClass.create();\r\n      d.getElementById(\"searchform\").appendChild(KorAP.Pipe.element());\r\n\r\n      try {\r\n      \r\n        // Register all plugins\r\n        p.forEach(i => KorAP.Plugin.register(i));\r\n      }\r\n      catch (e) {\r\n        KorAP.log(0, e);\r\n      }\r\n    };\r\n\r\n    return obj;\r\n  });\r\n  \r\n});\r\n\nwindow.KorAP = window.KorAP || {};\r\nKorAP.Locale = KorAP.Locale || {};\r\nrequire(['loc/dereko', 'init']);\r\n\ndefine(\"app/en\", function(){});\n\n}());"]}