{"version":3,"sources":["public/js/kalamar-0.43.0-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","_notItemElements","_itemClass","_lengthField","outline","_keydown","_keypress","_mousewheel","_touch","_items","Array","readItems","dontHide","_list","removeItems","liveLength","_firstActive","position","append","item","data","_initList","_boundary","prefixList","maxPoints","it","points","destroy","delta","deltaY","next","prev","slider","_lastTouch","touches","to","viewDown","viewUp","pageUp","pageDown","liveItem","show","fromCharCode","nr","_showItems","itemClass","_unmark","newOffset","onHide","pref","lengthField","liElements","ignoredCount","shownItem","newItem","_append","lastChild","_prepend","shown","menuClass","_left","_below","_outside","openAt","left","below","outside","panel","panelVar","_panel","button","btn","_button","_repos","_onscroll","title","cb","that","b","_bind","blur","bounding","getBoundingClientRect","pageXOffset","right","bottom","width","clientWidth","treeMenuClass","classes","adopt","_omBelow","_omOutside","_omLeft","anchor","_anchor","_insert","span","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","root","operators","toJson","@type","rewrites","incomplete","toQuery","jsonldClass","_validRewriteOpRE","json","fromJson","_src","_op","scope","attr","_scope","str","toUpperCase","rewriteClass","comments","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","actions","_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","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","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","firstBox","lastBox","overlaps","_arcsElement","pathStr","offsetLeft","_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","newText","defaultTextValue","isSelectable","letter","further","defaultContainerItemClass","listOfContainerItems","_containerItemClass","_cItemPrefix","items","addItem","cItem","addMenu","addPrefix","prefItem","exit","enter","ll","defaultMenuClass","defaultContainerClass","containerList","cLLength","_desc","hint","inputField","desc","lengthFieldClass","containerMenuClass","_context","_hint","_inputField","_alert","_unshowAlert","inputClass","analyzerClass","alertClass","_menuCollection","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","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","excludeStaticParent","overflowRegex","parentElement","overflow","overflowY","overflowX","offsetTop","instance","instances","setOption","option","setOptions","obj1","obj2","attrname","obj3","_mergeOptions","addStep","addSteps","goToStepNumber","previousStep","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","ds","dataset","total","count","widgetClass","stateClass","pageInfoClass","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","pi","URL","_removeListener","Uint8Array","crypto","getRandomValues","randomID","notNullRe","_notNull","_pipe","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","back","setSelectionRange","execCommand","initCopyToClipboard","pwd","initTogglePwdVisibility"],"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\n/**\r\n * Add option to show passwords.\r\n */\r\nfunction initTogglePwdVisibility (element) {\r\n    const el = element.querySelectorAll(\"input[type=password].show-pwd\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const pwd = el[x];\r\n\r\n        const a = document.createElement('a');\r\n        a.classList.add('show-pwd');         \r\n        a.addEventListener('click', function () {\r\n            if (pwd.getAttribute(\"type\") === \"password\") {\r\n                pwd.setAttribute(\"type\", \"text\");\r\n                a.classList.add('hide');\r\n                return;\r\n            };\r\n            pwd.setAttribute(\"type\", \"password\");\r\n            a.classList.remove('hide');\r\n        });\r\n        pwd.parentNode.insertBefore(a, pwd.nextSibling);\r\n    };\r\n};\r\n\r\n\r\n/**\r\n * Add option to copy to clipboard.\r\n */\r\nfunction initCopyToClipboard (element) {\r\n    const el = element.querySelectorAll(\"input.copy-to-clipboard\");\r\n    for (let x = 0; x < el.length; x++) {     \r\n        const text = el[x];\r\n        const a = document.createElement('a');\r\n        a.classList.add('copy-to-clipboard');         \r\n        a.addEventListener('click', function () {\r\n            let back = false;\r\n            if (text.getAttribute(\"type\") === 'password') {\r\n                text.setAttribute(\"type\", \"text\");\r\n                back = true;\r\n            };\r\n            text.select();\r\n            text.setSelectionRange(0, 99999);\r\n            document.execCommand(\"copy\");\r\n            if (back) {\r\n                text.setAttribute(\"type\", \"password\");\r\n            };\r\n        });\r\n        text.parentNode.insertBefore(a, text.nextSibling);\r\n    };\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\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a tag tagName as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} tagName The tag the children are looked for by\r\n * @returns An array of children nodes with tag tagName\r\n */\r\nfunction directElementChildrenByTagName (element, tagName) {\r\n  const tagElementsCollection=element.getElementsByTagName(tagName);\r\n  //var tagElements = Array.from(tagElementsCollection);\r\n  //var tagElements = [...tagElementsCollection];\r\n  //This one has the best compatability:\r\n  var tagElements = Array.prototype.slice.call(tagElementsCollection);\r\n  //filter by actually being direct child node\r\n  tagElements = tagElements.filter(subElement => subElement.parentNode === element);\r\n  return tagElements;\r\n};\r\n\r\n/**\r\n * A Method for generating an array of nodes, that are direct descendants of the passed\r\n * element node, using a class className as a parameter. Supposed to be used by the specification only.\r\n * @param {HTMLNode} element The HTMLNode / element object whose children we are fetching\r\n * @param {String} className The class the children are looked for by\r\n * @returns An array of children nodes with class className\r\n */\r\n function directElementChildrenByClassName (element, className) {\r\n  const classElementsCollection=element.getElementsByTagName(className);\r\n  //var classElements = Array.from(classElementsCollection);\r\n  //var classElements = [...classElementsCollection];\r\n  //This one has the best compatability:\r\n  var classElements = Array.prototype.slice.call(classElementsCollection);\r\n  //filter by actually being direct child node\r\n  classElements = classElements.filter(subElement => subElement.parentNode === element);\r\n  return classElements;\r\n};\nwindow.KorAP = window.KorAP || {};\r\n\r\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      if (params === undefined)\r\n        params = {};\r\n\r\n      const t = this;\r\n      t._notItemElements=3;\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(); //all childNodes, i.e. ItemClass, prefixClass\r\n\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; //filtered List containing all itemClass items\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    // Append item to list\r\n    append : function (item) {\r\n      const t = this;\r\n      // This is cyclic!\r\n      item[\"_menu\"] = t;\r\n      t._list = undefined;\r\n      t.removeItems();\r\n      t._items.push(item);\r\n      t._lengthField.add([item.content().data]);\r\n      t._slider.length(t.liveLength()).reInit();\r\n      t._firstActive = false;\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      // Upon change also update alwaysmenu.js please\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      // Upon change also update alwaysmenu.js please\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      //Upon change also update alwaysmenu.js please\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      //Upon change please also update alwaysmenu.js and containermenu.js (only two lines new there)\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      var ignoredCount = 0; //counts how many LI tag elements are not actually direct children\r\n      while (liElements.length>ignoredCount){\r\n        if (liElements[ignoredCount].parentNode === this._el){\r\n          this._el.removeChild(liElements[ignoredCount]);\r\n        } else {\r\n          ignoredCount++;\r\n        }\r\n      };\r\n     },\r\n      \r\n\r\n\r\n    /**\r\n     * Get a specific item from the complete list\r\n     *\r\n     * @param {number} index of the list item\r\n     */\r\n    item : function (index) {\r\n      return this._items[index]\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the filtered list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the filtered list\r\n     */\r\n    liveItem : function (index) {\r\n      if (this._list === undefined)\r\n        if (!this._initList())\r\n          return;\r\n\r\n      return this._items[this._list[index]];\r\n    },\r\n\r\n\r\n    /**\r\n     * Get a specific item from the viewport list\r\n     *\r\n     * @param {number} index of the list item\r\n     *        in the visible list\r\n     */\r\n    shownItem : function (index) {\r\n      if (index >= this.limit())\r\n        return;\r\n\r\n      return this.liveItem(this.offset + index);\r\n    },\r\n\r\n\r\n    /**\r\n     * Get the length of the full item list\r\n     */\r\n    length : function () {\r\n      return this._items.length;\r\n    },\r\n\r\n\r\n    /**\r\n     * Length of the filtered item list.\r\n     */\r\n    liveLength : function () {\r\n      if (this._list === undefined)\r\n        this._initList();\r\n      return this._list.length;\r\n    },\r\n\r\n    \r\n    /**\r\n     * Make the next item in the filtered menu active\r\n     */\r\n    next : function () {\r\n      //Upon change please update alwaysmenu.js next\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      //Upon Change please update alwaysmenu.js prev\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        //console.log(\"_showItems, at _notItemElements is: \",t._el.children[this._notItemElements]);\r\n        t._el.removeChild(t._el.children[this._notItemElements]);\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        //console.log(\"_showItems, at lastChild is: \",t._el.lastChild);\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[this._notItemElements]\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\n// TODO:\r\n//   Add addToggle() method\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 list of items and the itemClass.\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\tthis.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      this._left = false;\r\n      this._below = false;\r\n      this._outside = false;\r\n\r\n      return obj;\r\n    },\r\n\r\n    /**\r\n     * Open the menu at a certain position\r\n     * relative to the button.\r\n     */\r\n    openAt : function (left, below, outside) {\r\n      this._left = left ? true : false;\r\n      this._below = below ? true : false;\r\n      this._outside = outside ? true : false;\r\n    },\r\n\r\n    /**\r\n     * The panel object of the menu,\r\n     * in case the menu was spawned by a panel.\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    /**\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      let that = this;\r\n\r\n      const cbWrap = function (e) {\r\n\r\n        // Call callback\r\n        let obj = that._bind || this;\r\n        obj.button = b;\r\n        cb.apply(obj)\r\n      };\r\n\r\n      // TODO:\r\n      //   support classes, data-icon and state in itemClass!\r\n      const b = this.itemClass().create([title, title, cbWrap]);\r\n      this.append(b);\r\n      return b;\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      const s = this._el.style;\r\n\r\n      let left = window.pageXOffset;\r\n      let top = 0;\r\n\r\n      s.right = 'auto';\r\n      s.bottom = 'auto';\r\n\r\n      left += bounding.left;\r\n      \r\n      if (this._left) {\r\n        left += bounding.width - this._el.clientWidth\r\n      };\r\n\r\n      if (this._below) {\r\n        top += bounding.bottom;\r\n        \r\n        if (!this._outside) {\r\n          top -= bounding.height;\r\n        };\r\n\r\n      } else {\r\n        top -= this._el.clientHeight;\r\n        if (this._outside) {\r\n          top += bounding.top;\r\n        } else {\r\n          top += bounding.bottom;\r\n        };\r\n      };\r\n\r\n      s.left = left + \"px\";\r\n      s.top = top + \"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    /**\r\n     * Adopt existing button group element\r\n     */\r\n    adopt : function (element) {\r\n      const obj = Object.create(this);\r\n      obj._el = element;\r\n      return obj;\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        classes.forEach(i => {\r\n          switch (i) {\r\n          case \"open-menu-below\" : {\r\n            this._omBelow = true;\r\n            break;\r\n          }\r\n          case \"open-menu-outside\" : {\r\n            this._omOutside = true;\r\n            break;\r\n          }\r\n          case \"open-menu-left\" : {\r\n            this._omLeft = true;\r\n          }\r\n          }\r\n        })\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     * Return main element\r\n     */\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    /**\r\n     * Define element following newly added buttons.\r\n     */\r\n    anchor : function (anchor) {\r\n      if (anchor.parentNode == this._el) {\r\n        this._anchor = anchor;\r\n        return true;\r\n      };\r\n      return false;\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    _insert : function (tag = 'span') {\r\n      const span = document.createElement(tag);\r\n      if (this._anchor) {\r\n        this._el.insertBefore(span, this._anchor);\r\n        return span;\r\n      }\r\n      return this._el.appendChild(span);\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      const b = this._insert('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\r\n      list.openAt(\r\n        this._omLeft ? true : false,\r\n        this._omBelow ? true : false,\r\n        this._omOutside ? true : false,\r\n      );\r\n      \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    /*\r\n     * addToggle() should be removed in favor of add(toggleObj)\r\n     * or similar, so the API of buttongroups and lists is similar\r\n     * for use as action plugins.\r\n     */\r\n    addToggle : function (title, data, state) {\r\n      const b = this._insert('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 actions of the panel.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\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     * The actions of the view.\r\n     * Can be represented as a buttongroup,\r\n     * a list, ..., requires an \"add()\" minimum at least.\r\n     */\r\n    actions : function () {\r\n      return this._actions;\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 * API/ skeleton/ base class for an item contained within a container.\r\n * Here we see which functions container supports for containerItems.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\n//\"use strict\";\r\n\r\ndefine('container/containeritem',{\r\n\r\n  /**\r\n   * API for an item contained within a container\r\n   */\r\n  create : function () {\r\n    return Object.create(this); //._init();\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   * 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) return cl.contains(\"active\");\r\n    else if (bool) cl.add(\"active\");\r\n    else cl.remove(\"active\"); //allows for setting it to inactive if not (equal to undefined or truthy)\r\n  },\r\n\r\n  /**\r\n   * Get/create the document element of the container item. Can be overwritten. Standard class: li\r\n   * If you wish to change the textNode please overwrite the content function instead.\r\n   */\r\n  element : function () {\r\n    //Call Order: First this class is created and then upgraded To whatever object is passed to container\r\n    //Then container calls first element() and then container()\r\n    if (this._el !== undefined) 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    return this._el = li;\r\n  },\r\n\r\n  /**\r\n   * Get/create a TextNode with text \"content\". If content is left blank it gets set to this.defaultTextValue,\r\n   * or the empty string if it does not exists\r\n   * @param {String} content String to which to set the text\r\n   * @returns textNode with content or undefined\r\n   */\r\n  content : function (content) {\r\n    var newText; //set textNode to this\r\n    if (arguments.length === 1) { //new value!\r\n      newText = content;\r\n    } else { //use default\r\n      if (this.defaultTextValue === undefined) { //default default is \"\"\r\n        this.defaultTextValue = \"\";\r\n      }\r\n      newText = this.defaultTextValue;\r\n    };\r\n    if (this._content === undefined) { //no Element until now\r\n      this._content = document.createTextNode(newText); //create one\r\n      this.element().appendChild(this._content);\r\n    } else { //just change it\r\n      this._content.nodeValue = newText; // use nodeValue instead of _innerHTML\r\n    };\r\n    return this._content;\r\n  },\r\n\r\n  /**\r\n   * Expected to be overwritten. Default returns true always.\r\n   * @returns whether the item is currently an option to be selected, or if it should just be skipped\r\n   */\r\n  isSelectable : function () {\r\n    return true;\r\n  },\r\n\r\n  /**\r\n   * API skeleton for reading letters. Expected to be overwritten.\r\n   * @param {String} letter The letter to be read\r\n   */\r\n  add : function (letter) {},\r\n    \r\n  \r\n  /**\r\n   * API skeleton for clearing whole contents. Expected to be overwritten.\r\n   */\r\n  clear : function () {},\r\n  \r\n  \r\n  /**\r\n   * API skeleton method for execution. Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  onclick : function (e) {},\r\n  \r\n    \r\n  /**\r\n   * API skeleton method for when backspace is pressed. Expected to be overwritten.\r\n   */\r\n  chop : function () {},\r\n\r\n  /**\r\n   * API skeleton method for pressing \"right\". Expected to be overwritten.\r\n   * @param {Event} event Event passed down by menu.\r\n   */\r\n  further : function (e) {},\r\n\r\n  /**\r\n   * Return menu list. This._menu gets written by the container class\r\n   */\r\n  menu : function () {\r\n    return this._menu;\r\n  }\r\n\r\n});\n/**\r\n * Container for several containerItem style items. Functions like a mini menu with next, prev, add etc propagation,\r\n * but no event handling or slider or lengthField. Supposed to be subelement to a (container)menu class item.\r\n * \r\n * @author Leo Repp\r\n */\r\n\r\n\r\ndefine('container/container',[\r\n  'container/containeritem'   //TODO why does this not work!!!\r\n], function (\r\n  defaultContainerItemClass\r\n) {\r\n\r\n  return {\r\n    /**\r\n     * \r\n     * @param {Array<object>} listOfContainerItems List of items that will be placed within the container and that realise some of the functions supplied in containeritem.js\r\n     * @param {object} params May contain attribute containerItemClass for a base class all containerItems build upon\r\n     * @returns The container object\r\n     */\r\n    create : function (listOfContainerItems, params) {\r\n      var obj = Object.create(this);\r\n      obj._init(listOfContainerItems, params);\r\n      return obj;\r\n    },\r\n\r\n    _init : function (listOfContainerItems, params){\r\n      if (params !== undefined && params[\"containerItemClass\"] !== undefined){\r\n        this._containerItemClass = params[\"containerItemClass\"];\r\n      } else {\r\n        this._containerItemClass = defaultContainerItemClass;\r\n      };\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', 'container'); //container class allows for more stylesheet changes\r\n\r\n      this._el = el;\r\n      this._cItemPrefix = undefined; //required for re-setting the menus pointer correctly\r\n      // after having upgraded a new item scss style to the prefix object.\r\n\r\n      this.items = new Array();\r\n      if (listOfContainerItems !== undefined) {\r\n        for (let item of listOfContainerItems) {\r\n          this.addItem(item);\r\n        }\r\n      }\r\n\r\n      this.position = undefined; //undefined = not in container, 0 to length-1 = in container\r\n\r\n      \r\n      //t._el.classList.add('visible'); //Done by containermenu\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     * Adds a static item to this container by creating a standard containerItem as specified when this container was created,\r\n     * then upgrading it to the item passed to this function, and calling element() and content(). For a full list of supported functions see\r\n     * containeritem.js .\r\n     * Example:\r\n     * \r\n     * menu.container().addItem(\r\n     *  {defaultTextValue : \"dynamic\", onClick : function (e) { ... }\r\n     * )\r\n     * \r\n     *  For a full demo see containermenudemo.js.\r\n     * \r\n     * @param {Object} item An object with any number of functions like in containeritem.js or an attribute defaultTextValue,\r\n     * as well as any number of own properties.\r\n     * @returns the new use-ready containerItem\r\n     */\r\n    addItem : function (item) {\r\n      //Call Order: First _containerItemClass is created and then upgraded To whatever object is passed to this function\r\n      //Then container calls first element() and then container()\r\n      var cItem = this._containerItemClass.create().upgradeTo(item);\r\n      cItem._menu = this._menu; //if not set then undefined, but thats OK\r\n      this.items.push(cItem);\r\n      if (this._cItemPrefix !== undefined){ //this must be dynamic adding of CIs, move prefix to the back\r\n        this.items.splice(this.items.indexOf(this._cItemPrefix) , 1); //remove cItemPrefix\r\n        this.items.push(this._cItemPrefix); //and move it to the end;\r\n      };\r\n      this._el.appendChild(cItem.element());\r\n      cItem.content(); // create its textNode\r\n      return cItem;\r\n    },\r\n\r\n    addMenu : function (menu) {\r\n      this._menu = menu;\r\n      if (this._cItemPrefix !== undefined) {\r\n        this._menu._prefix = this._cItemPrefix; // better than going via classList or something\r\n      };\r\n      for (let item of this.items) {\r\n        item._menu=menu;\r\n      }\r\n    },\r\n\r\n    addPrefix : function (prefix) {\r\n      prefix.isSelectable =  function () {\r\n        return this.isSet(); //TODO check!\r\n      }\r\n      prefix.content = function (t) {}; //Does not need a textNode Child!\r\n      var prefItem = this.addItem(prefix);\r\n      this._cItemPrefix = prefItem;\r\n      prefItem._el[\"onclick\"] = prefItem.onclick.bind(prefItem);\r\n      if (this._menu !== undefined){\r\n        this._menu._prefix=prefItem;\r\n      }\r\n    },\r\n\r\n    /**\r\n     * Exit the container unconditionally. Required so that active returns the\r\n     * correct result. Called when the prefix or similar resets the currently visual\r\n     * field.\r\n     */\r\n    exit : function () {\r\n      if (this.position !== undefined) {\r\n        this.item().active(false);\r\n        this.position = undefined;\r\n      };\r\n    },\r\n\r\n    element : function () {\r\n      return this._el;\r\n    },\r\n\r\n    destroy : function () {\r\n      for (let item of this.items){\r\n        delete item['_menu'];\r\n      }\r\n    },\r\n\r\n    /**\r\n     * @returns whether an item within the container is active (by checking this.position)\r\n     */\r\n    active : function () {\r\n      return this.position !== undefined;\r\n    },\r\n\r\n    /**\r\n     * Getter for items\r\n     * @param {Integer} index [optional] Index of to select item. If left blank this.position.\r\n     * @returns item at location index\r\n     */\r\n    item : function (index) {\r\n      if (index === undefined) return this.items[this.position];\r\n      return this.items[index];\r\n    },\r\n\r\n    /**\r\n     * Move on to the next item in container. Returns true if we then leave the container, false otherwise.\r\n     */\r\n    next : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position++;\r\n      } else {\r\n        this.position = 0;\r\n      };\r\n      if (this.position >= this.length()) {\r\n        this.position=undefined;\r\n        return true;\r\n      };\r\n      while (!this.item().isSelectable()) {\r\n        this.position++;\r\n        if (this.position >= this.length()) {\r\n          this.position=undefined;\r\n          return true;\r\n        }\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    /**\r\n     * Move on to the previous item in container. Returns true if we then leave the container, false otherwise.\r\n     */\r\n    prev : function() {\r\n      if (this.position !== undefined){\r\n        this.item().active(false);\r\n        this.position = (this.position-1)\r\n      } else {\r\n        this.position = (this.items.length-1);\r\n      }\r\n      if (this.position<0) {\r\n        this.position=undefined;\r\n        return true;\r\n      }\r\n      while (!this.item().isSelectable()) {\r\n        this.position--;\r\n        if (this.position<0){\r\n          this.position=undefined;\r\n          return true;\r\n        };\r\n      };\r\n      this.item().active(true);\r\n      return false;\r\n    },\r\n\r\n    further : function () {\r\n      const item = this.item();\r\n      if (item[\"further\"] !== undefined) {\r\n        item[\"further\"].bind(item).apply();\r\n      };\r\n    },\r\n\r\n    enter : function (event) {\r\n      this.item().onclick(event);\r\n    },\r\n\r\n    chop : function () {\r\n      for (let item of this.items) {\r\n        item.chop();\r\n      }\r\n    },\r\n\r\n    add : function (letter) {\r\n      for (let item of this.items) {\r\n        item.add(letter);\r\n      }\r\n    },\r\n\r\n    length : function () {\r\n      return this.items.length;\r\n    },\r\n\r\n    /**\r\n     * \r\n     * @returns The number of items that are selectable. Is the actual length of the list.\r\n     */\r\n    liveLength : function () {\r\n      var ll = 0;\r\n      for (let item of this.items){\r\n        if (item.isSelectable()){\r\n          ll++;\r\n        }\r\n      }\r\n      return ll;\r\n    }\r\n\r\n};\r\n});\n/**\r\n * Menu with a container for always visible non scrollable items (can also be made invisible)\r\n * Automatically moves the prefix into the container. See containeritem.js for an API of functions\r\n * a container will call on containeritem.\r\n * \r\n * @author Leo Repp, with reused code by Nils Diewald\r\n */\r\n\r\n\r\ndefine('containermenu',[\r\n  'menu',\r\n  'container/container',\r\n  'util'\r\n], function (defaultMenuClass,\r\n             defaultContainerClass) {\r\n\r\n  return {\r\n    /**\r\n     * Create new Container Menu based on the action prefix\r\n     * and a list of menu items.\r\n     *\r\n     * Accepts an associative array containg the elements\r\n     * itemClass, prefixClass, lengthFieldClass, containerClass, containerItemClass\r\n     *\r\n     * @this {Menu}\r\n     * @constructor\r\n     * @param {string} params Context prefix\r\n     * @param {Array.<Array.<string>>} list List of menu items\r\n     * @param {Array.<Array.<containerItem>>} containerList List of container items\r\n     */\r\n    create : function (list, params, containerList) {\r\n      const obj = defaultMenuClass.create(list, params)\r\n          .upgradeTo(this)\r\n          ._init(list, params);\r\n      \r\n      obj._el.classList.add('containermenu');\r\n\r\n      //add container object and allow for own containerClasses\r\n      if (params!==undefined && params[\"containerClass\"] !== undefined) {\r\n        obj._container = params[\"containerClass\"].create(containerList, params);\r\n      } else {\r\n        obj._container = defaultContainerClass.create(containerList, params);\r\n      }\r\n      obj.container().addMenu(obj); //this is your menu, container!\r\n\r\n      // add entry to HTML element\r\n      obj._el.appendChild(obj.container().element());\r\n      obj._el.removeChild(obj._prefix.element()); //different HTML element relationship required\r\n      //Keep prefix as 'pref' style. The additional distance is fine.\r\n      obj.container().addPrefix(obj._prefix); //creates containeritem as base for prefix that then is upgraded to prefix. Also ajust _menu chains.\r\n      return obj;\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      // Upon change also update alwaysmenu.js please\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      t.container().destroy();\r\n      delete t.container()['_menu'];\r\n    },\r\n\r\n    // Arrow key and container 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.container().active()){\r\n          t.container().further();\r\n          e.halt();\r\n          break;\r\n        }\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.container().active()){\r\n          t.container().enter(e);\r\n        } else { // Click on item\r\n          t.liveItem(t.position).onclick(e);\r\n        };\r\n        e.halt();\r\n        break;\r\n\r\n      case 8: // 'Backspace'\r\n        t.container().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 and other interested items\r\n    _keypress : function (e) {\r\n      if (e.charCode !== 0) {\r\n        e.halt();\r\n        \r\n        // Add prefix and other interested items\r\n        this.container().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     * 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      //there are only two new lines, marked with NEW\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      t.container().exit(); //NEW\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        t.container()._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      t.container()._el.classList.add('visible'); //NEW\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 () { //only one new line\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        this.container()._el.classList.remove('visible'); //NEW\r\n      }\r\n      // this._el.blur();\r\n    },\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      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n      // No list\r\n      if (t.liveLength()===0){\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.next();\r\n        if (notInContainerAnyMore) {\r\n          c.next();\r\n        }\r\n        return;\r\n      };\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);} //this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position++;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().next(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = 0;\r\n            t._showItems(0);\r\n            newItem=t.liveItem(0);\r\n          };\r\n        } else {\r\n          t.position = 0;\r\n          t._showItems(0);\r\n          newItem=t.liveItem(0);\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      // 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      if (newItem !== undefined) {\r\n        newItem.active(true);\r\n      };\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      var notInContainerAnyMore;\r\n      const c = t.container();\r\n      const cLLength = c.liveLength();\r\n\r\n      // No list\r\n      if (t.liveLength() === 0) {\r\n        if (cLLength === 0) return;\r\n        notInContainerAnyMore = c.prev();\r\n        if (notInContainerAnyMore) {\r\n          c.prev();\r\n        }\r\n        return;\r\n      }\r\n      if (!c.active() && t.position!==-1) {t.liveItem(t.position).active(false);}//this should be enough to ensure a valid t.position\r\n      if (!c.active()){\r\n        t.position--;\r\n      };\r\n      let newItem = t.liveItem(t.position); //progress\r\n      if (newItem === undefined) { //too far\r\n        t.position = -1;\r\n        let offset =  t.liveLength() - t.limit();\r\n        // Normalize offset\r\n        offset = offset < 0 ? 0 : offset;\r\n        if (cLLength !== 0){ //actually makes sense to next\r\n          notInContainerAnyMore = t.container().prev(); //activate container\r\n          if (notInContainerAnyMore) { //oh, next one (should not happen, because cLLength is now liveLength)\r\n            t.position = t.liveLength() - 1;\r\n            newItem = t.liveItem(t.position);\r\n            t._showItems(offset);\r\n          } else {\r\n            t.offset = offset;\r\n          };\r\n        } else {\r\n          t.position = t.liveLength() - 1;\r\n          newItem = t.liveItem(t.position);\r\n          t._showItems(offset);\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      if (newItem !== undefined) {\r\n        newItem.active(true);\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     * Get the container object\r\n     */\r\n    container : function () {\r\n      return this._container;\r\n    }\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\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  'containermenu',\r\n\t'hint/item',\r\n\t'hint/prefix',\r\n\t'hint/lengthField'\r\n], function (\r\n  containerMenuClass,\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 = containerMenuClass.create(params, {\r\n        itemClass : itemClass,\r\n        prefixClass : prefixClass,\r\n        lengthFieldClass : lengthFieldClass})\r\n\t      .upgradeTo(this);\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._menuCollection   = {};\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._menuCollection[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._menuCollection[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._menuCollection[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\r\ndefine('pageInfo',[],function () {\r\n  return {\r\n    create : function () {\r\n      const o = Object.create(this);\r\n      const p = document.getElementById('pagination');\r\n      o.ds = p ? p.dataset : {};\r\n      return o;\r\n    },\r\n    page : function () {\r\n      return parseInt(this.ds[\"page\"] || 0);\r\n    },\r\n    total : function () {\r\n      return parseInt(this.ds[\"total\"] || 0);\r\n    },\r\n    count : function () {\r\n      return parseInt(this.ds[\"count\"] || 0);\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', 'pageInfo', 'util'], function (widgetClass, serviceClass, stateClass, pageInfoClass) {\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 a 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\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      // TODO: Check e.origin is in the list of registered participants\r\n      // if (e.origin !== \"http://example.com:8080\")\r\n      //   return;\r\n\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 form\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[\"param\"] = p; // readonly\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        // Get pagination information\r\n        else if (d.key == 'Pagination') {\r\n          const pi = pageInfoClass.create();\r\n          let v = d[\"value\"] = {};\r\n          v[\"page\"] = pi.page();\r\n          v[\"total\"] = pi.total();\r\n          v[\"count\"] = pi.count();\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        break;\r\n\r\n        // Redirect to a different page relative to the current\r\n      case 'redirect':\r\n        const url = new URL(window.location);\r\n\r\n        // Currently this only accepts search parameters\r\n        if (d[\"queryParam\"]) {\r\n          url.search = new URLSearchParams(d[\"queryParam\"]);\r\n        };\r\n\r\n        window.location = url.toString();\r\n        break;\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 (e._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    });\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    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initCopyToClipboard(d);\r\n\r\n      \r\n    /**\r\n     * Initialize password toggle.\r\n     */\r\n    initTogglePwdVisibility(d);\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}());"]}