{"version":3,"sources":["public/js/kalamar-0.41.5-de.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","liElements","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","ADDTREE","SHOWANNO","SHOWINFO","DOWNLOAD","TOGGLE_ALIGN","SHOW_KQ","SHOW_META","NEW_QUERY","NEW_CONSTRAINT","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_glimpse","TOUR_help","TOUR_seargo","TOUR_kwic","TOUR_snippet","TOUR_snippetb","TOUR_metadatab","TOUR_metadata","TOUR_tokenb","TOUR_token","TOUR_treeb","TOUR_tree","TOUR_tourdone","foundry","_foundry","layer","_layer","addTree","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","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","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","matchtree","h6","_tree","treeObj","body","treeItemClass","tableView","metaView","relationsView","buttonGroupMenuClass","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","qs","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","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","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","_actionJSON","requestType","jsObj","returnValueCB","errorCB","XMLHttpRequest","reqE","bubbles","setRequestHeader","onreadystatechange","retJSObj","responseText","status","statusText","send","legacy","docFragment","getJSON","getCollections","cq","getPluginList","putJSON","postJSON","deleteJSON","getQueryList","getQuery","qn","putQuery","postQuery","deleteQuery","PArok","href","pow","matchClass","tutClass","vcArray","alertifyClass","selectMenuClass","resultPanelClass","queryPanelClass","tourClass","pluginClass","pipeClass","kqe","gt","tourshowR","vcname","vcchoose","matchElements","aside","asideClicked","resultInfo","resultPanel","sb","vcclick","tutorial","form","qf","queryPanel","sform","vcView","pe"],"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('non-item');\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    \r\n     removeItems : function () {\r\n      const liElements=this._el.getElementsByTagName(\"LI\");\r\n      while (liElements.length>0){\r\n        this._el.removeChild(liElements[0]);\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('loc/de',[],function () {\r\n  const loc = KorAP.Locale;\r\n  loc.OR = 'oder';\r\n  loc.AND = 'und';\r\n  // EMPTY, DELETE\r\n\r\n  // Virtual corpus:\r\n  loc.VC_allCorpora = 'allen Korpora';\r\n  loc.VC_oneCollection = 'einem virtuellen Korpus';\r\n\r\n  // Regex:\r\n  loc.REGEX_DESC = loc.REGEX_DESC || 'Regulären Ausdruck verwenden';\r\n\r\n  // Date picker:\r\n  loc.WDAY = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];\r\n  loc.MONTH = [\r\n    'Januar', 'Februar', 'März', 'April',\r\n    'Mai', 'Juni', 'Juli', 'August',\r\n    'September', 'Oktober', 'November',\r\n    'Dezember'\r\n  ];\r\n\r\n  // Match view\r\n  loc.ADDTREE   = 'Relationen';\r\n  loc.SHOWANNO  = 'Token';\r\n  loc.SHOWINFO  = 'Informationen';\r\n  loc.CLOSE     = 'Schließen';\r\n  loc.MINIMIZE  = 'Zuklappen';\r\n  loc.DOWNLOAD  = 'Herunterladen';\r\n  loc.TOGGLE_ALIGN = 'tausche Textausrichtung';\r\n  loc.SHOW_KQ      = 'zeige KoralQuery';\r\n  loc.SHOW_META    = 'Metadaten';\r\n  loc.NEW_QUERY = 'Neue Anfrage';\r\n  \r\n  //Corpus statistic\r\n  loc.SHOW_STAT = 'Korpusstatistik';\r\n  loc.REFRESH = 'Neu laden';\r\n  //verbose description, for title attributes for example\r\n  //loc.VERB_SHOWSTAT = 'Korpusstatistik';\r\n\r\n  loc.NEW_CONSTRAINT = 'Neue Bedingung';\r\n\r\n  //Guided Tour:Buttonlabels\r\n  loc.TOUR_lskip = \"Abbrechen\";\r\n  loc.TOUR_lprev = \"Zurück\";\r\n  loc.TOUR_lnext = \"Weiter\";\r\n  loc.TOUR_ldone = \"Beenden\";\r\n  loc.TOUR_ldoneSearch = \"Suchen\";\r\n  \r\n  //Guided Tour: Steps\r\n  loc.TOUR_welc = \"<span class = 'tgreeting'>Willkommen zur KorAP Tour! </span> \" +\r\n  \"<p class='pfirstStep'> Hier zeigen wir Ihnen einige wichtige Funktionalitäten von KorAP. \" +\r\n  \"Wir führen Sie Schritt bei Schritt anhand eines Beispiels durch die Anwendung. </p>\";  \r\n  loc.TOUR_sear1 = \"Eingabe der Suchanfrage, zum Beispiel die Suche nach '\" + loc.TOUR_Qexample + \"'.\" ;\r\n  loc.TOUR_searAnnot =\"Für die Suche nach Annotationen steht der Annotationsassistent zur Verfügung.\";\r\n  loc.TOUR_annotAss = \"Der Annotationsassistent erleichert die Formulierung von Suchanfragen mit Annotationen.\";\r\n  loc.TOUR_vccho1 = \"Öffnen des Korpusassistenten\";\r\n  loc.TOUR_vccho2 = \"Eigene Definition von Subkorpora durch Verknüpfung beliebiger Metadatenfelder.\";\r\n  loc.TOUR_vcStat1 = \"Es besteht die Möglichkeit, die Korpusstatistik anzuzeigen.\";\r\n  loc.TOUR_vcStat2 = \"Korpusstatistik\";\r\n  loc.TOUR_qlfield = \"Auswahl der Suchanfragesprache: In KorAP können mehrere Suchanfragesprachen verwendet werden.\";\r\n  loc.TOUR_glimpse = \"Beim Wählen dieser Option wird festgelegt ob nur die ersten Treffer in undefinierter Reihenfolge ausgewählt werden.\";\r\n  loc.TOUR_help = \"Hilfe zu KorAP\";\r\n  loc.TOUR_seargo = \"Suchanfrage starten\";\r\n\r\n  \r\n  //Guided Tour: explain the result\r\n  loc.TOUR_kwic = \"Anzeige des Ergebnisses als KWIC (keyword in context).\";\r\n  loc.TOUR_snippet = \"Durch Klicken auf das KWIC kann ein größerer Kontext angezeigt werden.\";  \r\n  loc.TOUR_snippetb = \"Anzeige des Snippets\";\r\n  loc.TOUR_metadatab = \"Durch die Auswahl des Buttons werden die Metadaten angezeigt.\";\r\n  loc.TOUR_metadata = \"Anzeige der Metadaten\";\r\n  loc.TOUR_tokenb = loc.TOUR_tokenb || \"Anzeige der Token-Annotationen\";\r\n  loc.TOUR_token = loc.TOUR_token || \"KorAP unterstützt multiple Annotationen.\";\r\n  loc.TOUR_treeb = loc.TOUR_tree || \"Anzeige weiterer Ansichten\"\r\n  loc.TOUR_tree = loc.TOUR_tree || \"Weitere Ansichten können als Baum- oder Bogenansichten angezeigt werden.\";\r\n  loc.TOUR_tourdone = \"Viel Spaß mit KorAP!\";\r\n  \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      let qs = d.querySelectorAll('pre.query.tutorial:not(.unsupported)');\r\n      const that = this;\r\n      for (var i = 0; i < qs.length; i++) {\r\n\t      qs[i].onclick = function (e) {\r\n\t        that.useQuery(this,e);\r\n\t      };\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          let vchoo = doe.querySelector(\"#vc-choose\");\r\n          let 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   * Retrieve a list of all plugin objects to\r\n   * establish in the frontend.\r\n   */\r\n  KorAP.API.getPluginList = function (url, cb) {\r\n    KorAP.API.getJSON(url, cb, \"Plugin-List\")\r\n  };\r\n\r\n  /**\r\n   * General function to communicate JS Objects with the server\r\n   * \r\n   * @param {HTTMLRequestType} requestType Should be \"GET\", \"PUT\", \"POST\" or \"DELETE\"\r\n   * @param {String} url The url that specifies where the JSON file is (\"GET\"), will be (\"PUT\" and \"POST\") or will have been (\"DELETE\")\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {JSObj} jsObj For \"PUT\" and \"POST\". The JS Object that is getting transfered. This function stringifies it.\r\n   * @param {function} returnValueCB For \"GET\". The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  function _actionJSON (requestType, url, title, jsObj, returnValueCB, errorCB) {\r\n    const req = new XMLHttpRequest();\r\n    req.open(requestType, url, true); \r\n    // Dispatch global \"window\" event. See Kalamar::Plugin::Piwik\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(\"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        if (requestType === \"GET\") { //GET\r\n          let retJSObj;\r\n          try {\r\n            retJSObj = JSON.parse(this.responseText);\r\n          }\r\n          catch (e) {\r\n            KorAP.log(0, e);\r\n            console.log(e);\r\n            returnValueCB(undefined);\r\n            return;\r\n          };\r\n\r\n          if (retJSObj !== undefined && retJSObj[\"errors\"] !== undefined) {\r\n            retJSObj[\"errors\"].forEach(\r\n              e => KorAP.log(e[0], e[1] || \"Unknown\")\r\n            );\r\n          }\r\n\r\n          else if (this.status !== 200) {\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n\r\n          if (this.status === 200) {\r\n            returnValueCB(retJSObj);\r\n          }\r\n\r\n          else {\r\n            returnValueCB(undefined);\r\n          };\r\n\r\n        } else { // PUT, POST, DELETE\r\n          if (this.status >= 300 || this.status < 200) { //Error\r\n            KorAP.log(this.status, this.statusText, \"Remote service error (XMLHttpRequest) under URL: \" + url);\r\n          };\r\n        };\r\n        // Call the callback function (no matter requestType) if one is given.\r\n        if (typeof(errorCB) === \"function\"){\r\n          errorCB({\r\n            \"status\" : this.status,\r\n            \"statusText\" : this.statusText\r\n          });\r\n        }; \r\n      };\r\n    };\r\n\r\n    /*Set a value for .timeout to use this functionality */\r\n    //req.ontimeout = function () {\r\n    //  KorAP.log(0, 'Request Timeout');\r\n    //};\r\n    if (requestType === \"POST\" || requestType === \"PUT\") {\r\n      req.send(JSON.stringify(jsObj));\r\n    } else { //GET, DELETE\r\n      req.send();\r\n    };\r\n  };\r\n\r\n  /**\r\n   * General method to get JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {function} returnValueCB The callback function that receives the retrieved JS object (already parsed) as a parameter, or undefined if none is eligible\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.getJSON = function (url, returnValueCB, title, errorCB) {\r\n    _actionJSON(\"GET\", url, title, undefined, returnValueCB, errorCB);\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 {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.putJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"PUT\", url, title, jsObj, undefined, errorCB);\r\n  };\r\n\r\n  /**\r\n   * General method to post JSON information.\r\n   * \r\n   * @param {String} url The url at which the JSON File will be located\r\n   * @param {JSObj} jsObj The JS object that is getting transfered. This will be stringified\r\n   * @param {String} title How to store this request in the logs\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.postJSON = function (url, jsObj, title, errorCB) {\r\n    _actionJSON(\"POST\", url, title, jsObj, undefined, errorCB);\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} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */ \r\n  KorAP.API.deleteJSON = function (url, title, errorCB) {\r\n    _actionJSON(\"DELETE\", url, title, undefined, undefined, errorCB);\r\n  };\r\n\r\n\r\n  // Stored query related functions\r\n\r\n  /**\r\n   * Retrieve saved list of queries\r\n   * \r\n   * @param {function} returnValueCB The callback function that receives the JS object Listof queries, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQueryList = function (returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\", returnValueCB, \"getSavedQueryList\", errorCB);\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} returnValueCB The callback function that receives the query JS object Object, already parsed\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.getQuery = function (qn, returnValueCB, errorCB){\r\n    KorAP.API.getJSON(KorAP.URL + \"/query/\" + qn, returnValueCB, \"getSavedQuery of name \"+ qn, errorCB);\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 {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.putQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.putJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"putQuery of name \"+ qn, errorCB);\r\n  };\r\n\r\n  /**\r\n   * Post new query by query name\r\n   * \r\n   * @param {String} qn The name of the new query\r\n   * @param {JSObj} jsObj The query. This will be stringified\r\n   * @param {function} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.postQuery = function (qn, jsObj, errorCB){\r\n    KorAP.API.postJSON(KorAP.URL + \"/query/\" + qn, jsObj, \"postQuery of name \"+ qn, errorCB);\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} errorCB Optional. Callback function for error handling, receives JS object with status and statusText attribute\r\n   */\r\n  KorAP.API.deleteQuery = function (qn, errorCB){\r\n    KorAP.API.deleteJSON(KorAP.URL + \"/query/\" + qn, \"deleteQuery of name \"+ qn, errorCB);\r\n  };\r\n});\r\n\n// See Mojolicious::Plugin::TagHelpers::MailToChiffre\r\ndefine('mailToChiffre',[],function () {\r\n  window.PArok=function(k,c){if(c){k=document.createElement('a');k.href=c}var q=k.search,b=RegExp,f=String.fromCharCode,t='il',x=[],o,n=Math.pow;d=k.pathname.match(/([^\\/]+)\\/([^\\/]+)$/);p=function(u){var a=0,e,g='',m;while(a<u.length){m=u.charAt(a++);if(m.match(/[A-Za-z]/)){g+=f((m<='Z'?90:122)>=(m=m.charCodeAt(0)+13)?m:m-26)}else if(m=='-'){e='';m=u.charAt(a++);while(m.match(/\\d/)){e+=m;m=u.charAt(a++)}a--;g+=f(parseInt(e))}else return}l=g.length;r=Math.abs(673%l-l);g=g.substr(r)+g.substr(0,r);o='';for(i=0;i<l;i++){o+=f(g.charCodeAt(i)^d[1].charCodeAt(d[1].length%(i+1)))}return o};while(q){q=q.replace(/^[\\?\\&]([^\\&]+)/,'');o=b.$1;if(o.match(/^(sid|b?cc|to)=(.+)$/)){if(b.$1=='sid')x.push('to='+p(b.$2)+'@'+p(d[2]));else x.push(b.$1+'='+p(b.$2));}else x.push(o.replace(/\\+/g,' '))}location.href='ma'+t+'to:?'+x.join('&');return false};document.querySelectorAll(\".PArok\").forEach(i=>i.addEventListener(\"click\",function(e){e.preventDefault();window.PArok(false,this.href=='#'?this.getAttribute('data-href'):this.href)}))\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  // 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  let gt;\r\n  if (gt = document.getElementById('link-guided-tour')) {\r\n    gt.setAttribute('href', '#');\r\n    gt.addEventListener('click', 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\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    d.querySelectorAll('#notifications div.notify').forEach(\r\n      function(e) {\r\n        let msg = e.textContent;\r\n\r\n        let src = e.getAttribute('data-src');\r\n        if (src) {\r\n          msg += '<code class=\"src\">'+src+'</code>';\r\n        };\r\n\r\n        let type = e.getAttribute('data-type') || \"error\";\r\n        alertifyClass.log(msg, type, 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 pe;\r\n    if (pe = d.getElementById(\"kalamar-plugins\")) {\r\n      let url = pe.getAttribute('data-plugins');\r\n      if (url !== undefined) {\r\n        KorAP.API.getPluginList(url, function (json) {\r\n          if (json && json.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              json.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      };\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', 'loc/de', 'init']);\r\n\ndefine(\"app/de\", function(){});\n\n}());"]}